]> granicus.if.org Git - clang/commitdiff
Update RetainCountChecker to understand attribute ns_returns_autoreleased.
authorTed Kremenek <kremenek@apple.com>
Thu, 20 Dec 2012 19:36:22 +0000 (19:36 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 20 Dec 2012 19:36:22 +0000 (19:36 +0000)
Fixes <rdar://problem/12887356>.

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

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

index b38894ccfac3a4b4967d6363c2cd8835e2f642f9..b57c6e2b4fbcc01aa15b63db2473000bb3c0bf32 100644 (file)
@@ -1306,13 +1306,14 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
     else if (FD->getAttr<CFReturnsRetainedAttr>()) {
       Template->setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true));
     }
-    else if (FD->getAttr<NSReturnsNotRetainedAttr>()) {
+    else if (FD->getAttr<NSReturnsNotRetainedAttr>() ||
+             FD->getAttr<NSReturnsAutoreleasedAttr>()) {
       Template->setRetEffect(RetEffect::MakeNotOwned(RetEffect::ObjC));
     }
-    else if (FD->getAttr<CFReturnsNotRetainedAttr>()) {
+    else if (FD->getAttr<CFReturnsNotRetainedAttr>())
       Template->setRetEffect(RetEffect::MakeNotOwned(RetEffect::CF));
     }
-  } else if (RetTy->getAs<PointerType>()) {
+    else if (RetTy->getAs<PointerType>()) {
     if (FD->getAttr<CFReturnsRetainedAttr>()) {
       Template->setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true));
     }
@@ -1359,7 +1360,8 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
       Template->setRetEffect(ObjCAllocRetE);
       return;
     }
-    if (MD->getAttr<NSReturnsNotRetainedAttr>()) {
+    if (MD->getAttr<NSReturnsNotRetainedAttr>() ||
+        MD->getAttr<NSReturnsAutoreleasedAttr>()) {
       Template->setRetEffect(RetEffect::MakeNotOwned(RetEffect::ObjC));
       return;
     }
index ef2566b9616b48a378bef0f98e6bce48160e9882..2b5a4adced9cb8d5b94930758d7d543260a1910f 100644 (file)
@@ -25,6 +25,9 @@
 #if __has_feature(attribute_cf_consumed)
 #define CF_CONSUMED __attribute__((cf_consumed))
 #endif
+#if __has_attribute(ns_returns_autoreleased)
+#define NS_RETURNS_AUTORELEASED __attribute__((ns_returns_autoreleased))
+#endif
 
 //===----------------------------------------------------------------------===//
 // The following code is reduced using delta-debugging from Mac OS X headers:
@@ -1300,6 +1303,7 @@ typedef NSString* MyStringTy;
 - (NSString*) returnsAnOwnedCFString  CF_RETURNS_RETAINED; // no-warning
 - (MyStringTy) returnsAnOwnedTypedString NS_RETURNS_RETAINED; // no-warning
 - (NSString*) newString NS_RETURNS_NOT_RETAINED; // no-warning
+- (NSString*) newString_auto NS_RETURNS_AUTORELEASED; // no-warning
 - (NSString*) newStringNoAttr;
 - (int) returnsAnOwnedInt NS_RETURNS_RETAINED; // expected-warning{{'ns_returns_retained' attribute only applies to methods that return an Objective-C object}}
 - (id) pseudoInit NS_CONSUMES_SELF NS_RETURNS_RETAINED;
@@ -1320,6 +1324,8 @@ void test_attr_1b(TestOwnershipAttr *X) {
 void test_attr1c(TestOwnershipAttr *X) {
   NSString *str = [X newString]; // no-warning
   NSString *str2 = [X newStringNoAttr]; // expected-warning{{leak}}
+  NSString *str3 = [X newString_auto]; // no-warning
+  NSString *str4 = [[X newString_auto] retain]; // expected-warning {{leak}}
 }
 
 void testattr2_a() {