]> granicus.if.org Git - clang/commitdiff
[analyzer] Add missing return after function pointer null check.
authorJordan Rose <jordan_rose@apple.com>
Wed, 2 Oct 2013 01:20:28 +0000 (01:20 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 2 Oct 2013 01:20:28 +0000 (01:20 +0000)
Also add some tests that there is actually a message and that the bug is
actually a hard error. This actually behaved correctly before, because:

- addTransition() doesn't actually add a transition if the new state is null;
  it assumes you want to propagate the predecessor forward and does nothing.
- generateSink() is called in order to emit a bug report.
- If at least one new node has been generated, the predecessor node is /not/
  propagated forward.

But now it's spelled out explicitly.

Found by Richard Mazorodze, who's working on a patch that may require this.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191805 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
test/Analysis/func.c

index d5ab479ec3c58c486bc8e275544b7e510b0adc59..fefcbe7b09cb55766271a4fcc997ac34dc7f5107 100644 (file)
@@ -249,6 +249,7 @@ void CallAndMessageChecker::checkPreStmt(const CallExpr *CE,
       BT_call_null.reset(
         new BuiltinBug("Called function pointer is null (null dereference)"));
     emitBadCall(BT_call_null.get(), C, Callee);
+    return;
   }
 
   C.addTransition(StNonNull);
index 9abb560e758355ea44ec5807fcea85c5181f0859..275a82da2e7c8c9e1a8c1b7a995111d256999e60 100644 (file)
@@ -25,3 +25,16 @@ void f3(void (*f)(void), void (*g)(void)) {
   (*g)();
   clang_analyzer_eval(!g); // expected-warning{{FALSE}}
 }
+
+void nullFunctionPointerConstant() {
+  void (*f)(void) = 0;
+  f(); // expected-warning{{Called function pointer is null}}
+  clang_analyzer_eval(0); // no-warning
+}
+
+void nullFunctionPointerConstraint(void (*f)(void)) {
+  if (f)
+    return;
+  f(); // expected-warning{{Called function pointer is null}}
+  clang_analyzer_eval(0); // no-warning
+}