diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-23 21:25:57 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-23 21:25:57 +0000 |
commit | f9df1362f0f2768ddab01fbf8d60c4808e641162 (patch) | |
tree | e45d6862d03423239932f8e8d5427b834ed44f02 | |
parent | 829bf507946a3db93400ff8b096adb88e6bc994d (diff) |
retain/release checker: Don't call isTrackedObject() with the canonical type.
This was preventing the checker from tracking return objects referenced by 'id'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69922 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 16 | ||||
-rw-r--r-- | test/Analysis/NSString.m | 2 | ||||
-rw-r--r-- | test/Analysis/retain-release.m | 2 |
3 files changed, 9 insertions, 11 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 98221fe32b..575a47b776 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -703,7 +703,7 @@ public: RetainSummary* getSummary(FunctionDecl* FD); RetainSummary* getMethodSummary(ObjCMessageExpr* ME, ObjCInterfaceDecl* ID); - RetainSummary* getClassMethodSummary(ObjCMessageExpr *ME, Selector S); + RetainSummary* getClassMethodSummary(ObjCMessageExpr *ME); bool isGCEnabled() const { return GCEnabled; } }; @@ -1071,7 +1071,7 @@ RetainSummaryManager::getMethodSummary(ObjCMessageExpr* ME, return getInitMethodSummary(ME); // Look for methods that return an owned object. - if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType()))) + if (!isTrackedObjectType(ME->getType())) return 0; // EXPERIMENTAL: Assume the Cocoa conventions for all objects returned @@ -1089,13 +1089,13 @@ RetainSummaryManager::getMethodSummary(ObjCMessageExpr* ME, } RetainSummary* -RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME, - Selector S) { +RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME) { // FIXME: Eventually we should properly do class method summaries, but // it requires us being able to walk the type hierarchy. Unfortunately, // we cannot do this with just an IdentifierInfo* for the class name. IdentifierInfo* ClsName = ME->getClassName(); + Selector S = ME->getSelector(); // Look up a summary in our cache of Selectors -> Summaries. ObjCMethodSummariesTy::iterator I = ObjCClassMethodSummaries.find(ClsName, S); @@ -1104,15 +1104,13 @@ RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME, return I->second; // Look for methods that return an owned object. - if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType()))) + if (!isTrackedObjectType(ME->getType())) return 0; // EXPERIMENTAL: Assume the Cocoa conventions for all objects returned // by class methods. // Look for methods that return an owned object. - if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType()))) - return 0; - + const char* s = S.getIdentifierInfoForSlot(0)->getName(); RetEffect E = followsFundamentalRule(s) ? (isGCEnabled() ? RetEffect::MakeNotOwned(RetEffect::ObjC) @@ -2014,7 +2012,7 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst, } } else - Summ = Summaries.getClassMethodSummary(ME, ME->getSelector()); + Summ = Summaries.getClassMethodSummary(ME); EvalSummary(Dst, Eng, Builder, ME, ME->getReceiver(), Summ, ME->arg_begin(), ME->arg_end(), Pred); diff --git a/test/Analysis/NSString.m b/test/Analysis/NSString.m index a486e0e071..a95e8868c3 100644 --- a/test/Analysis/NSString.m +++ b/test/Analysis/NSString.m @@ -248,6 +248,6 @@ void test_objc_atomicCompareAndSwap() { void test_stringWithFormat() { NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain]; [string release]; - [string release]; + [string release]; // expected-warning{{Incorrect decrement of the reference count}} } diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index 5a0471ae88..012e340f56 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -335,7 +335,7 @@ static void rdar_6659160(char *inkind, char *inname) return; [kind release]; - [name release]; + [name release]; // expected-warning{{Incorrect decrement of the reference count}} } // PR 3677 - 'allocWithZone' should be treated as following the Cocoa naming |