]> 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, 16 Oct 2019 20:23:36 +0000 (22:23 +0200)
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

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

index 442f2d16cf0684acd29855b6108d375bff04556b..5400d1bb852080284c615e56bec3648f070f74ca 100644 (file)
@@ -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:
index 730cfc268fcc8839b9663d3335da88bf3424bfee..9f65d629702877ac0b0d9ad60e19c2834e4173c6 100644 (file)
@@ -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 */
 
 /*