diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-04-25 01:21:50 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-04-25 01:21:50 +0000 |
| commit | e75de954088bc795c7a88b975f18daf3685040ce (patch) | |
| tree | e8742beada3230f73ff59b36b0e28741fd94b27b /clang | |
| parent | f005eac566a3b6e506d6437305805907ed4313d7 (diff) | |
| download | bcm5719-llvm-e75de954088bc795c7a88b975f18daf3685040ce.tar.gz bcm5719-llvm-e75de954088bc795c7a88b975f18daf3685040ce.zip | |
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).
llvm-svn: 70008
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/Parse/AttributeList.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Analysis/retain-release.m | 4 |
3 files changed, 15 insertions, 4 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 9080e668764..bb957b89f55 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/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/clang/lib/Parse/AttributeList.cpp b/clang/lib/Parse/AttributeList.cpp index a205c0468a0..8048db887de 100644 --- a/clang/lib/Parse/AttributeList.cpp +++ b/clang/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/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index 0de2025398d..ae1b75c2162 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/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]; } |

