]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix cppcheck 1.89 warnings
authorMichał Kępień <michal@isc.org>
Wed, 16 Oct 2019 20:06:00 +0000 (22:06 +0200)
committerMichał Kępień <michal@isc.org>
Wed, 4 Mar 2020 11:41:01 +0000 (12:41 +0100)
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)

.gitlab-ci.yml
lib/isc/include/isc/util.h

index ffa7aa5878c2e1b33a8f900dd178ad840b244b24..56905b61590922ffc08a28721e9f2cbda6062c2c 100644 (file)
@@ -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:
index be4c608016449d79741fdee5a80576d9c06c5f6b..792a92c21940cd723ada150bdbe8874e0426a9a6 100644 (file)
@@ -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 */
 
 /*