From 1c8b31753b0699960d314a67dba2c71ba832e6ae Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Fri, 11 Jul 2014 08:08:47 +0000 Subject: [clang-tidy] Add a checker for implicit bool conversion of a bool*. The goal is to find code like the example below, which is likely a typo where someone meant to write "if (*b)". bool *b = SomeFunction(); if (b) { // b never dereferenced } This checker naturally has a relatively high false positive rate so it applies some heuristics to avoid cases where the pointer is checked for nullptr before being written. Differential Revision: http://reviews.llvm.org/D4458 llvm-svn: 212797 --- .../misc-bool-pointer-implicit-conversion.cpp | 86 ++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp (limited to 'clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp') diff --git a/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp b/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp new file mode 100644 index 00000000000..98cfd667242 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/misc-bool-pointer-implicit-conversion.cpp @@ -0,0 +1,86 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-bool-pointer-implicit-conversion %t +// REQUIRES: shell + +bool *SomeFunction(); +void SomeOtherFunction(bool*); +bool F(); +void G(bool); + + +template +void t(T b) { + if (b) { + } +} + +void foo() { + bool *b = SomeFunction(); + if (b) { +// CHECK-MESSAGES: dubious check of 'bool *' against 'nullptr' +// CHECK-FIXES: if (*b) { + } + + if (F() && b) { +// CHECK-MESSAGES: dubious check of 'bool *' against 'nullptr' +// CHECK-FIXES: if (F() && *b) { + } + + // TODO: warn here. + if (b) { + G(b); + } + +#define TESTMACRO if (b || F()) + + TESTMACRO { +// CHECK-MESSAGES: dubious check of 'bool *' against 'nullptr' +// Can't fix this. +// CHECK-FIXES: #define TESTMACRO if (b || F()) +// CHECK-FIXES: TESTMACRO { + } + +// CHECK-MESSAGES-NOT: warning: + + t(b); + + if (!b) { + // no-warning + } + + if (SomeFunction()) { + // no-warning + } + + bool *c = SomeFunction(); + if (c) { + (void)c; + (void)*c; // no-warning + } + + if (c) { + *c = true; // no-warning + } + + if (c) { + c[0] = false; // no-warning + } + + if (c) { + SomeOtherFunction(c); // no-warning + } + + if (c) { + delete[] c; // no-warning + } + + if (c) { + *(c) = false; // no-warning + } + + struct { + bool *b; + } d = { SomeFunction() }; + + if (d.b) + (void)*d.b; // no-warning +} -- cgit v1.2.3