]> granicus.if.org Git - clang/commitdiff
Hook up attribute 'objc_ownership_retain' to the analyzer. This attribute allows
authorTed Kremenek <kremenek@apple.com>
Sat, 25 Apr 2009 01:21:50 +0000 (01:21 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 25 Apr 2009 01:21:50 +0000 (01:21 +0000)
users to specify that a method's argument is visibly retained (reference count
incremented).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70008 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp
lib/Parse/AttributeList.cpp
test/Analysis/retain-release.m

index 9080e66876457c27e37baaf4a98812c17ef58bf1..bb957b89f5580f0f6c11bbdf6d5c52394c46de1d 100644 (file)
@@ -1095,7 +1095,18 @@ RetainSummaryManager::getMethodSummaryFromAnnotations(ObjCMethodDecl *MD) {
     }
   }
   
-  if (!hasRetEffect)
+  // Determine if there are any arguments with a specific ArgEffect.
+  bool hasArgEffect = false;
+  unsigned i = 0;
+  for (ObjCMethodDecl::param_iterator I = MD->param_begin(),
+       E = MD->param_end(); I != E; ++I, ++i) {
+    if ((*I)->getAttr<ObjCOwnershipRetainAttr>()) {
+      ScratchArgs.push_back(std::make_pair(i, IncRefMsg));
+      hasArgEffect = true;
+    }
+}
+  
+  if (!hasRetEffect && !hasArgEffect)
     return 0;
 
   return getPersistentSummary(RE);
index a205c0468a04b1bfeca7a87b63fe509e3f969736..8048db887de533f59dab052b629599cad1978e14 100644 (file)
@@ -135,7 +135,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
     break;
   case 21:
     if (!memcmp(Str, "objc_ownership_retain", 21))
-      return AT_objc_ownership_returns;      
+      return AT_objc_ownership_retain;      
   case 22:
     if (!memcmp(Str, "objc_ownership_returns", 22))
       return AT_objc_ownership_returns;
index 0de2025398d393b7b8c4fd4d442b9a912e0f1486..ae1b75c2162df16e7c045286b43c367acbbada5d 100644 (file)
@@ -411,7 +411,7 @@ void rdar6704930(unsigned char *s, unsigned int length) {
 
 @interface TestOwnershipAttr : NSObject
 - (NSString*) returnsAnOwnedString __attribute__((objc_ownership_returns));
-- (void) myRetain:(id __attribute__((objc_ownership_retain)))obj;
+- (void) myRetain:(id)__attribute__((objc_ownership_retain))obj;
 @end
 
 void test_attr_1(TestOwnershipAttr *X) {
@@ -419,7 +419,7 @@ void test_attr_1(TestOwnershipAttr *X) {
 }
 
 void test_attr_2(TestOwnershipAttr *X) {
-  NSString *str = [X returnsAnOwnedString]; // no-warning (yet)
+  NSString *str = [X returnsAnOwnedString]; // expected-warning{{leak}}
   [X myRetain:str];
   [str release];
 }