aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-04-25 01:21:50 +0000
committerTed Kremenek <kremenek@apple.com>2009-04-25 01:21:50 +0000
commit4da0427a20f31db9b6934b280d49ab264236b34c (patch)
treedbd2bde50ac02b1976711fed609a444a654303c7
parentc62a2fe1957626bc4b29402b2d0a3694dfaa3280 (diff)
Hook up attribute 'objc_ownership_retain' to the analyzer. This attribute allows
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
-rw-r--r--lib/Analysis/CFRefCount.cpp13
-rw-r--r--lib/Parse/AttributeList.cpp2
-rw-r--r--test/Analysis/retain-release.m4
3 files changed, 15 insertions, 4 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 9080e66876..bb957b89f5 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -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);
diff --git a/lib/Parse/AttributeList.cpp b/lib/Parse/AttributeList.cpp
index a205c0468a..8048db887d 100644
--- a/lib/Parse/AttributeList.cpp
+++ b/lib/Parse/AttributeList.cpp
@@ -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;
diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m
index 0de2025398..ae1b75c216 100644
--- a/test/Analysis/retain-release.m
+++ b/test/Analysis/retain-release.m
@@ -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];
}