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 | a8bcc658193d3d407b65893d5a8c7dcf8bfe7a17 (patch) | |
| tree | 4b8756829652ea6820cc95a72ff080a691819009 /clang | |
| parent | 6c26e747819b86bfbc22df6b813b09aee926e78b (diff) | |
| download | bcm5719-llvm-a8bcc658193d3d407b65893d5a8c7dcf8bfe7a17.tar.gz bcm5719-llvm-a8bcc658193d3d407b65893d5a8c7dcf8bfe7a17.zip | |
[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.
llvm-svn: 174104
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Analysis/retain-release.m | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index e731e034d85..533d0b84200 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/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/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index 44332d2451b..9de6cedaf05 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/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> |

