From: Michał Kępień Date: Wed, 16 Oct 2019 20:06:00 +0000 (+0200) Subject: Fix cppcheck 1.89 warnings X-Git-Tag: v9.15.6~57^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abfde3d543576311ce5d32089d774a360b7edc9f;p=thirdparty%2Fbind9.git Fix cppcheck 1.89 warnings cppcheck 1.89 enabled certain value flow analysis mechanisms [1] which trigger null pointer dereference false positives in lib/dns/rpz.c: lib/dns/rpz.c:582:7: warning: Possible null pointer dereference: tgt_ip [nullPointer] if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ lib/dns/rpz.c:1419:44: note: Calling function 'adj_trigger_cnt', 4th argument 'NULL' value is 0 adj_trigger_cnt(rpzs, rpz_num, rpz_type, NULL, 0, true); ^ lib/dns/rpz.c:582:7: note: Null pointer dereference if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ lib/dns/rpz.c:596:7: warning: Possible null pointer dereference: tgt_ip [nullPointer] if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ lib/dns/rpz.c:1419:44: note: Calling function 'adj_trigger_cnt', 4th argument 'NULL' value is 0 adj_trigger_cnt(rpzs, rpz_num, rpz_type, NULL, 0, true); ^ lib/dns/rpz.c:596:7: note: Null pointer dereference if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ lib/dns/rpz.c:610:7: warning: Possible null pointer dereference: tgt_ip [nullPointer] if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ lib/dns/rpz.c:1419:44: note: Calling function 'adj_trigger_cnt', 4th argument 'NULL' value is 0 adj_trigger_cnt(rpzs, rpz_num, rpz_type, NULL, 0, true); ^ lib/dns/rpz.c:610:7: note: Null pointer dereference if (KEY_IS_IPV4(tgt_prefix, tgt_ip)) { ^ It seems that cppcheck no longer treats at least some REQUIRE() assertion failures as fatal, so add extra assertion macro definitions to lib/isc/include/isc/util.h that are only used when the CPPCHECK preprocessor macro is defined; these definitions make cppcheck 1.89 behave as expected. There is an important requirement for these custom definitions to work: cppcheck must properly treat abort() as a function which does not return. In order for that to happen, the __GNUC__ macro must be set to a high enough number (because system include directories are used and system headers compile attributes away if __GNUC__ is not high enough). __GNUC__ is thus set to the major version number of the GCC compiler used, which is what that latter does itself during compilation. [1] https://github.com/danmar/cppcheck/commit/aaeec462e6d96bb70c2b1cf030979d09e2d7c959 --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 442f2d16cf0..5400d1bb852 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -256,6 +256,9 @@ stages: .cppcheck: &cppcheck_job <<: *default_triggering_rules stage: postcheck + before_script: + - export GCC_VERSION=$(gcc --version | sed -n 's/.*\([0-9]\+\)\.[0-9]\+\.[0-9]\+.*/\1/p') + - sed -i "/gcc\",/a\"-DCPPCHECK\", \"-D__STDC__\", \"-D__GNUC__=${GCC_VERSION}\"," compile_commands.json script: - *run_cppcheck after_script: diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 730cfc268fc..9f65d629702 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -234,6 +234,9 @@ extern void mock_assert(const int result, const char* const expression, #define _assert_int_not_equal(a, b, f, l) \ (((a) != (b)) ? (void)0 : (_assert_int_not_equal(a, b, f, l), abort())) #else /* UNIT_TESTING */ + +#ifndef CPPCHECK + /* * Assertions */ @@ -248,6 +251,19 @@ extern void mock_assert(const int result, const char* const expression, /*% Invariant Assertion */ #define INVARIANT(e) ISC_INVARIANT(e) +#else /* CPPCHECK */ + +/*% Require Assertion */ +#define REQUIRE(e) if (!(e)) abort() +/*% Ensure Assertion */ +#define ENSURE(e) if (!(e)) abort() +/*% Insist Assertion */ +#define INSIST(e) if (!(e)) abort() +/*% Invariant Assertion */ +#define INVARIANT(e) if (!(e)) abort() + +#endif /* CPPCHECK */ + #endif /* UNIT_TESTING */ /*