From: Michał Kępień Date: Wed, 16 Oct 2019 20:06:00 +0000 (+0200) Subject: Fix cppcheck 1.89 warnings X-Git-Tag: v9.11.17~12^2~3 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=ae7c0cca8959b8e46c5ba1ec017bf8095e468e32;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 that were previously not reported. 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 (cherry picked from commit abfde3d543576311ce5d32089d774a360b7edc9f) --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ffa7aa5878c..56905b61590 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -334,6 +334,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 be4c6080164..792a92c2194 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -247,6 +247,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 */ @@ -261,6 +264,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 */ /*