]> granicus.if.org Git - clang/commitdiff
[analyzer] Look through ExprWhenCleanups when trying to track a NULL.
authorJordan Rose <jordan_rose@apple.com>
Fri, 15 Mar 2013 21:41:46 +0000 (21:41 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 15 Mar 2013 21:41:46 +0000 (21:41 +0000)
Silences a few false positives in LLVM.

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

lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
test/Analysis/inlining/false-positive-suppression.cpp

index 8cd3eecf2b7ef1f96086d1a20477674885525cf4..bf616b1d267dd1c42c1a4968c8f2b72a29656daa 100644 (file)
@@ -778,7 +778,8 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N,
   if (!S || !N)
     return false;
 
-  // Peel off OpaqueValueExpr.
+  if (const ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(S))
+    S = EWC->getSubExpr();
   if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(S))
     S = OVE->getSourceExpr();
 
index 613f42111078060039ef21e384e17c109cf6f5f6..02782c3f23b65764f3425120efdad69eb48beb47 100644 (file)
@@ -40,6 +40,11 @@ inline void* operator new(__typeof__(sizeof(int)), void* __p) throw()
 
 extern bool coin();
 
+class SomeClass {
+public:
+  void doSomething();
+};
+
 namespace References {
   class Map {
     int *&getNewBox();
@@ -83,11 +88,6 @@ namespace References {
     *box = 1; // expected-warning {{Dereference of null pointer}}
   }
 
-  class SomeClass {
-  public:
-    void doSomething();
-  };
-
   SomeClass *&getSomeClass() {
     if (coin()) {
       extern SomeClass *&opaqueClass();
@@ -174,3 +174,39 @@ void test3() {
 }
 
 
+namespace Cleanups {
+  class NonTrivial {
+  public:
+    ~NonTrivial();
+
+    SomeClass *getNull() {
+      return 0;
+    }
+  };
+
+  void testImmediate() {
+    NonTrivial().getNull()->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testAssignment() {
+    SomeClass *ptr = NonTrivial().getNull();
+    ptr->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testArgumentHelper(SomeClass *arg) {
+    arg->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testArgument() {
+    testArgumentHelper(NonTrivial().getNull());
+  }
+}