]> granicus.if.org Git - clang/commitdiff
Teach RetainCountChecker about mixing method families with explicit annotations....
authorTed Kremenek <kremenek@apple.com>
Fri, 9 Mar 2012 23:34:08 +0000 (23:34 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 9 Mar 2012 23:34:08 +0000 (23:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152448 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
test/Analysis/retain-release.m

index a59d1e4e4caeb416790aaa48c82926a110775b0e..a5146b7cb2f09a8f2910506348b613cc6bd08e07 100644 (file)
@@ -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;
 
index 548564fe4c0deffbaa896cb46102b14f402dd361..8b0e7b83a7b9128159b33d414803cd819e5739f9 100644 (file)
@@ -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.
 //===----------------------------------------------------------------------===//