[cfe-commits] r70002 - in /cfe/trunk: lib/Analysis/CFRefCount.cpp test/Analysis/retain-release.m

Ted Kremenek kremenek at apple.com
Fri Apr 24 16:32:32 PDT 2009


Author: kremenek
Date: Fri Apr 24 18:32:32 2009
New Revision: 70002

URL: http://llvm.org/viewvc/llvm-project?rev=70002&view=rev
Log:
Hook up __attribute__((objc_ownership_returns)) to the retain/release checker.

Modified:
    cfe/trunk/lib/Analysis/CFRefCount.cpp
    cfe/trunk/test/Analysis/retain-release.m

Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=70002&r1=70001&r2=70002&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Fri Apr 24 18:32:32 2009
@@ -722,6 +722,7 @@
   RetainSummary* getMethodSummary(ObjCMessageExpr* ME, ObjCInterfaceDecl* ID);
   RetainSummary* getClassMethodSummary(ObjCMessageExpr *ME);
   RetainSummary* getCommonMethodSummary(ObjCMessageExpr *ME, Selector S);
+  RetainSummary* getMethodSummaryFromAnnotations(ObjCMethodDecl *MD);
   
   bool isGCEnabled() const { return GCEnabled; }
 };
@@ -1072,6 +1073,33 @@
   return Summ;
 }
 
+RetainSummary*
+RetainSummaryManager::getMethodSummaryFromAnnotations(ObjCMethodDecl *MD) {
+  if (!MD)
+    return 0;
+  
+  assert(ScratchArgs.empty());
+  
+  // Determine if there is a special return effect for this method.
+  bool hasRetEffect = false;
+  RetEffect RE = RetEffect::MakeNoRet();
+  
+  if (isTrackedObjectType(MD->getResultType())) {
+    if (MD->getAttr<ObjCOwnershipReturnsAttr>()) {
+      RE = RetEffect::MakeOwned(RetEffect::ObjC, true);
+      hasRetEffect = true;
+    }
+    else {
+      // Default to 'not owned'.
+      RE = RetEffect::MakeNotOwned(RetEffect::ObjC);
+    }
+  }
+  
+  if (!hasRetEffect)
+    return 0;
+
+  return getPersistentSummary(RE);
+}
 
 RetainSummary*
 RetainSummaryManager::getCommonMethodSummary(ObjCMessageExpr* ME, Selector S) {
@@ -1137,14 +1165,21 @@
   if (I != ObjCMethodSummaries.end())
     return I->second;
 
-  // "initXXX": pass-through for receiver.
   assert(ScratchArgs.empty());
+
+  // Annotations take precedence over all other ways to derive
+  // summaries.
+  RetainSummary *Summ = getMethodSummaryFromAnnotations(ME->getMethodDecl());
+  
+  if (!Summ) {      
+    // "initXXX": pass-through for receiver.
+    if (deriveNamingConvention(S.getIdentifierInfoForSlot(0)->getName()) 
+        == InitRule)
+      return getInitMethodSummary(ME);
   
-  if (deriveNamingConvention(S.getIdentifierInfoForSlot(0)->getName()) 
-      == InitRule)
-    return getInitMethodSummary(ME);
-  
-  RetainSummary *Summ = getCommonMethodSummary(ME, S);
+    Summ = getCommonMethodSummary(ME, S);
+  }
+
   ObjCMethodSummaries[ME] = Summ;
   return Summ;
 }
@@ -1153,7 +1188,7 @@
 RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr *ME) {
 
   Selector S = ME->getSelector();
-  ObjCMethodSummariesTy::iterator I;
+  ObjCMethodSummariesTy::iterator I;  
   
   if (ObjCInterfaceDecl *ID = ME->getClassInfo().first) {
     // Lookup the method using the decl for the class @interface.
@@ -1170,7 +1205,13 @@
   if (I != ObjCClassMethodSummaries.end())
     return I->second;
   
-  RetainSummary* Summ = getCommonMethodSummary(ME, S);
+  // Annotations take precedence over all other ways to derive
+  // summaries.
+  RetainSummary *Summ = getMethodSummaryFromAnnotations(ME->getMethodDecl());
+  
+  if (!Summ)
+    Summ = getCommonMethodSummary(ME, S);
+  
   ObjCClassMethodSummaries[ObjCSummaryKey(ME->getClassName(), S)] = Summ;
   return Summ;
 }

Modified: cfe/trunk/test/Analysis/retain-release.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/retain-release.m?rev=70002&r1=70001&r2=70002&view=diff

==============================================================================
--- cfe/trunk/test/Analysis/retain-release.m (original)
+++ cfe/trunk/test/Analysis/retain-release.m Fri Apr 24 18:32:32 2009
@@ -414,6 +414,6 @@
 @end
 
 void test_attr_1(TestOwnershipAttr *X) {
-  NSString *str = [X returnsAnOwnedString];
+  NSString *str = [X returnsAnOwnedString]; // expected-warning{{leak}}
 }
 





More information about the cfe-commits mailing list