aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-03-09 23:34:08 +0000
committerTed Kremenek <kremenek@apple.com>2012-03-09 23:34:08 +0000
commit7acf23f03e4598d9a68d4a5e5441947300f0d32c (patch)
tree13c6a868cb0873c18bb82dbb5d867cf28694c4f5
parent8a4e1829d608de66345701e2316e43daf60b6978 (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.cpp30
-rw-r--r--test/Analysis/retain-release.m20
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.
//===----------------------------------------------------------------------===//