diff options
author | Anna Zaks <ganna@apple.com> | 2013-01-31 22:36:17 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-01-31 22:36:17 +0000 |
commit | 0217b1d045ea99fe792e83ed1a785816289dd53c (patch) | |
tree | 7be265466d82a1426d13b4c75f6762926a4a0993 | |
parent | e36d81b1eeab13fb1bbd15291d009a1699de6ec1 (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.cpp | 2 | ||||
-rw-r--r-- | test/Analysis/retain-release.m | 8 |
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> |