[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