diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 42ef4ed..e2b03ba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,7 +7,7 @@ on: branches: [master] jobs: - test_deny_warnings: + nowarn_assert_defopt: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -20,7 +20,72 @@ jobs: - name: check run: make check - test_allow_warnings: + nowarn_assert_noopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --enable-assert --disable-multiboot2 CFLAGS='-O0 -Werror' + - name: make + run: make + - name: check + run: make check + + nowarn_assert_maxopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert --disable-multiboot2 CFLAGS='-O3 -Werror' + - name: make + run: make + - name: check + run: make check + + nowarn_noassert_defopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert --disable-multiboot2 CFLAGS='-Werror' + - name: make + run: make + - name: check + run: make check + + nowarn_noassert_noopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert --disable-multiboot2 CFLAGS='-O0 -Werror' + - name: make + run: make + - name: check + run: make check + + nowarn_noassert_maxopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert --disable-multiboot2 CFLAGS='-O3 -Werror' + - name: make + run: make + - name: check + run: make check + + warn_assert_defopt: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -32,3 +97,68 @@ jobs: run: make - name: check run: make check + + warn_assert_noopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --enable-assert CFLAGS='-O0' + - name: make + run: make + - name: check + run: make check + + warn_assert_maxopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert CFLAGS='-O3' + - name: make + run: make + - name: check + run: make check + + warn_noassert_defopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert + - name: make + run: make + - name: check + run: make check + + warn_noassert_noopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert CFLAGS='-O0' + - name: make + run: make + - name: check + run: make check + + warn_noassert_maxopt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure --disable-assert CFLAGS='-O3' + - name: make + run: make + - name: check + run: make check diff --git a/.gitignore b/.gitignore index a49f5c5..0482685 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ /tests/test_multiboot2_print /tests/test_multiboot2_validation /tests/test_pfa +/tests/test_pfa_assert /tests/test_printf /tests/test_stdlib /tests/test_units_human diff --git a/Makefile.am b/Makefile.am index bd4e188..f28d85e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -68,7 +68,8 @@ if ENABLE_PFA libkernaux_a_SOURCES += src/pfa.c TESTS += \ examples/pfa \ - tests/test_pfa + tests/test_pfa \ + tests/test_pfa_assert endif if ENABLE_UNITS @@ -134,6 +135,10 @@ tests_test_pfa_SOURCES = \ $(libkernaux_a_SOURCES) \ tests/test_pfa.c +tests_test_pfa_assert_SOURCES = \ + $(libkernaux_a_SOURCES) \ + tests/test_pfa_assert.c + tests_test_printf_SOURCES = \ $(libkernaux_a_SOURCES) \ tests/test_printf.c diff --git a/include/kernaux/pfa.h b/include/kernaux/pfa.h index 1bf46c2..e419967 100644 --- a/include/kernaux/pfa.h +++ b/include/kernaux/pfa.h @@ -18,23 +18,15 @@ struct KernAux_PFA { unsigned char flags[KERNAUX_PFA_FLAGS_SIZE]; }; -void KernAux_PFA_initialize(KernAux_PFA pfa) -__attribute__((nonnull)); +void KernAux_PFA_initialize(KernAux_PFA pfa); -bool KernAux_PFA_is_available(KernAux_PFA pfa, size_t page_addr) -__attribute__((nonnull)); +bool KernAux_PFA_is_available(KernAux_PFA pfa, size_t page_addr); -void KernAux_PFA_mark_available(KernAux_PFA pfa, size_t start, size_t end) -__attribute__((nonnull)); +void KernAux_PFA_mark_available(KernAux_PFA pfa, size_t start, size_t end); +void KernAux_PFA_mark_unavailable(KernAux_PFA pfa, size_t start, size_t end); -void KernAux_PFA_mark_unavailable(KernAux_PFA pfa, size_t start, size_t end) -__attribute__((nonnull)); - -size_t KernAux_PFA_alloc_pages(KernAux_PFA pfa, size_t mem_size) -__attribute__((nonnull)); - -void KernAux_PFA_free_pages(KernAux_PFA pfa, size_t page_addr, size_t mem_size) -__attribute__((nonnull)); +size_t KernAux_PFA_alloc_pages(KernAux_PFA pfa, size_t mem_size); +void KernAux_PFA_free_pages(KernAux_PFA pfa, size_t page_addr, size_t mem_size); #ifdef __cplusplus } diff --git a/src/pfa.c b/src/pfa.c index 70d6a41..5e048ef 100644 --- a/src/pfa.c +++ b/src/pfa.c @@ -36,18 +36,17 @@ static void KernAux_PFA_mark( bool status, size_t start, size_t end -) -__attribute__((nonnull)); +); void KernAux_PFA_initialize(const KernAux_PFA pfa) { - assert(pfa); + assert_return(pfa); kernaux_memset(pfa->flags, 0, sizeof(pfa->flags)); } bool KernAux_PFA_is_available(const KernAux_PFA pfa, const size_t page_addr) { - assert(pfa); + assert_retval(pfa, false); assert_retval(page_addr % KERNAUX_PFA_PAGE_SIZE == 0, false); return GET_FLAG_FROM_ADDR(pfa, page_addr); @@ -75,7 +74,7 @@ void KernAux_PFA_mark( size_t start, size_t end ) { - assert(pfa); + assert_return(pfa); assert_return(start < end); const size_t start_rem = start % KERNAUX_PFA_PAGE_SIZE; @@ -103,7 +102,7 @@ void KernAux_PFA_mark( size_t KernAux_PFA_alloc_pages(const KernAux_PFA pfa, size_t mem_size) { - assert(pfa); + assert_retval(pfa, 0); const size_t mem_rem = mem_size % KERNAUX_PFA_PAGE_SIZE; @@ -142,7 +141,7 @@ void KernAux_PFA_free_pages( const size_t page_addr, size_t mem_size ) { - assert(pfa); + assert_return(pfa); assert_return(page_addr % KERNAUX_PFA_PAGE_SIZE == 0); const size_t mem_rem = mem_size % KERNAUX_PFA_PAGE_SIZE; diff --git a/tests/test_pfa_assert.c b/tests/test_pfa_assert.c new file mode 100644 index 0000000..63c1766 --- /dev/null +++ b/tests/test_pfa_assert.c @@ -0,0 +1,73 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include + +static unsigned int count = 0; + +static void test(); + +static void assert_cb( + __attribute__((unused)) + const char *const file, + __attribute__((unused)) + const int line, + __attribute__((unused)) + const char *const str +) { + ++count; +} + +int main() +{ + kernaux_assert_cb = NULL; + test(); + +#ifdef ENABLE_ASSERT + kernaux_assert_cb = assert_cb; + test(); +#endif + + return 0; +} + +void test() +{ + struct KernAux_PFA pfa; + KernAux_PFA_initialize(&pfa); + + KernAux_PFA_initialize(NULL); + if (kernaux_assert_cb) assert(count == 1); + + assert(!KernAux_PFA_is_available(NULL, KERNAUX_PFA_PAGE_SIZE)); + if (kernaux_assert_cb) assert(count == 2); + + assert(!KernAux_PFA_is_available(&pfa, 123)); + if (kernaux_assert_cb) assert(count == 3); + + KernAux_PFA_mark_available(NULL, 0, KERNAUX_PFA_PAGE_SIZE); + if (kernaux_assert_cb) assert(count == 4); + + KernAux_PFA_mark_available(&pfa, KERNAUX_PFA_PAGE_SIZE, 0); + if (kernaux_assert_cb) assert(count == 5); + + KernAux_PFA_mark_unavailable(NULL, 0, KERNAUX_PFA_PAGE_SIZE); + if (kernaux_assert_cb) assert(count == 6); + + KernAux_PFA_mark_unavailable(&pfa, KERNAUX_PFA_PAGE_SIZE, 0); + if (kernaux_assert_cb) assert(count == 7); + + assert(KernAux_PFA_alloc_pages(NULL, KERNAUX_PFA_PAGE_SIZE) == 0); + if (kernaux_assert_cb) assert(count == 8); + + KernAux_PFA_free_pages(NULL, KERNAUX_PFA_PAGE_SIZE, KERNAUX_PFA_PAGE_SIZE); + if (kernaux_assert_cb) assert(count == 9); + + KernAux_PFA_free_pages(&pfa, 123, KERNAUX_PFA_PAGE_SIZE); + if (kernaux_assert_cb) assert(count == 10); +}