aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2013-01-31 22:36:17 +0000
committerAnna Zaks <ganna@apple.com>2013-01-31 22:36:17 +0000
commit0217b1d045ea99fe792e83ed1a785816289dd53c (patch)
tree7be265466d82a1426d13b4c75f6762926a4a0993
parente36d81b1eeab13fb1bbd15291d009a1699de6ec1 (diff)
[analyzer]RetainCount: Fix an autorelease related false positive.
The Cnt variable is adjusted (incremented) for simplification of checking logic. The increment should not be stored in the state. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174104 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp2
-rw-r--r--test/Analysis/retain-release.m8
2 files changed, 9 insertions, 1 deletions
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index e731e034d8..533d0b8420 100644
--- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -3487,7 +3487,7 @@ RetainCountChecker::handleAutoreleaseCounts(ProgramStateRef state,
else
V = V ^ RefVal::NotOwned;
} else {
- V.setCount(Cnt - ACnt);
+ V.setCount(V.getCount() - ACnt);
V.setAutoreleaseCount(0);
}
return setRefBinding(state, Sym, V);
diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m
index 44332d2451..9de6cedaf0 100644
--- a/test/Analysis/retain-release.m
+++ b/test/Analysis/retain-release.m
@@ -1784,6 +1784,13 @@ extern id NSApp;
id contextObject = (id)contextInfo;
[contextObject release];
}
+
+- (id)copyAutoreleaseRadar13081402 {
+ id x = [[[NSString alloc] initWithUTF8String:"foo"] autorelease];
+ [x retain];
+ return x; // no warning
+}
+
@end
//===----------------------------------------------------------------------===//
// Test returning allocated memory in a struct.
@@ -1961,6 +1968,7 @@ void test_drain() {
}
+
// CHECK: <key>diagnostics</key>
// CHECK-NEXT: <array>
// CHECK-NEXT: <dict>