diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-03-09 23:34:08 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-03-09 23:34:08 +0000 |
commit | 7acf23f03e4598d9a68d4a5e5441947300f0d32c (patch) | |
tree | 13c6a868cb0873c18bb82dbb5d867cf28694c4f5 | |
parent | 8a4e1829d608de66345701e2316e43daf60b6978 (diff) |
Teach RetainCountChecker about mixing method families with explicit annotations. Fixes <rdar://problem/10824732>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152448 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 30 | ||||
-rw-r--r-- | test/Analysis/retain-release.m | 20 |
2 files changed, 50 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index a59d1e4e4c..a5146b7cb2 100644 --- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -1192,6 +1192,36 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ, return; RetainSummaryTemplate Template(Summ, DefaultSummary, *this); + + // Check the method family, and apply any default annotations. + switch (MD->getMethodFamily()) { + case OMF_None: + break; + case OMF_init: + Template->setRetEffect(ObjCInitRetE); + Template->setReceiverEffect(DecRefMsg); + break; + case OMF_alloc: + case OMF_new: + case OMF_copy: + case OMF_mutableCopy: + Template->setRetEffect(ObjCAllocRetE); + break; + case OMF_autorelease: + Template->setReceiverEffect(Autorelease); + case OMF_retain: + Template->setReceiverEffect(IncRefMsg); + break; + case OMF_release: + Template->setReceiverEffect(DecRefMsg); + break; + case OMF_self: + case OMF_performSelector: + case OMF_retainCount: + case OMF_dealloc: + case OMF_finalize: + break; + } bool isTrackedLoc = false; diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index 548564fe4c..8b0e7b83a7 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -1647,6 +1647,26 @@ void rdar9658496() { xpc_release(xpc); } +// Support annotations with method families. +@interface RDar10824732 : NSObject +- (id)initWithObj:(id CF_CONSUMED)obj; +@end + +@implementation RDar10824732 +- (id)initWithObj:(id)obj { + [obj release]; + return [super init]; +} +@end + +void rdar_10824732() { + @autoreleasepool { + NSString *obj = @"test"; + RDar10824732 *foo = [[RDar10824732 alloc] initWithObj:obj]; // no-warning + [foo release]; + } +} + //===----------------------------------------------------------------------===// // ObjC literals support. //===----------------------------------------------------------------------===// |