From 0217b1d045ea99fe792e83ed1a785816289dd53c Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Thu, 31 Jan 2013 22:36:17 +0000 Subject: [PATCH] [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 --- lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 2 +- test/Analysis/retain-release.m | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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: diagnostics // CHECK-NEXT: // CHECK-NEXT: -- 2.50.1