]> granicus.if.org Git - clang/commitdiff
[analyzer] Don't create new PostStmt nodes if we don't have to.
authorJordan Rose <jordan_rose@apple.com>
Wed, 18 Jun 2014 19:23:30 +0000 (19:23 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 18 Jun 2014 19:23:30 +0000 (19:23 +0000)
Doing this caused us to mistakenly think we'd seen a particular state before
when we actually hadn't, which resulted in false negatives. Credit to
Rafael Auler for discovering this issue!

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

lib/StaticAnalyzer/Core/CoreEngine.cpp
test/Analysis/retain-release-cache-out.m [new file with mode: 0644]

index e710c7f717b4298be1d57a33fa4f0f7c4f3e59f9..4623c358a9e2c980ad8112d43569f6a5adcfffa5 100644 (file)
@@ -541,7 +541,7 @@ void CoreEngine::enqueueStmtNode(ExplodedNode *N,
   CFGStmt CS = (*Block)[Idx].castAs<CFGStmt>();
   PostStmt Loc(CS.getStmt(), N->getLocationContext());
 
-  if (Loc == N->getLocation()) {
+  if (Loc == N->getLocation().withTag(nullptr)) {
     // Note: 'N' should be a fresh node because otherwise it shouldn't be
     // a member of Deferred.
     WList->enqueue(N, Block, Idx+1);
diff --git a/test/Analysis/retain-release-cache-out.m b/test/Analysis/retain-release-cache-out.m
new file mode 100644 (file)
index 0000000..54573a4
--- /dev/null
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -analyze %s -analyzer-checker=core,osx.cocoa.RetainCount -fblocks -verify
+
+// This test is checking behavior when a single checker runs only with the core
+// checkers, testing that the traversal order in the CFG does not affect the
+// reporting of an error.
+
+#import "Inputs/system-header-simulator-objc.h"
+
+void testDoubleRelease(BOOL z) {
+  id x = [[NSObject alloc] init];
+  if (z) {
+    [x release];
+  } else {
+    ;
+  }
+  [x release]; // expected-warning {{Reference-counted object is used after it is released}}
+}
+
+void testDoubleRelease2(BOOL z) {
+  id x = [[NSObject alloc] init];
+  if (z) {
+    ;
+  } else {
+    [x release];
+  }
+  [x release]; // expected-warning {{Reference-counted object is used after it is released}}
+}