diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-05-13 18:16:01 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-05-13 18:16:01 +0000 |
commit | 70b6a83b833c40f320d0ed2310cbcdf2be4cece0 (patch) | |
tree | baf9e5059e6bcd28ff207be6e3802563a3312d7e /lib/Analysis/CFRefCount.cpp | |
parent | 5b53005fb9ef24b8bdfe995f29b4662de468128a (diff) |
Fix crasher reported in PR 4209 caused by an invalid summary
generation when EvalObjCMessageExpr() did not resolve the
ObjCInterfaceDecl* for a receiver when the receiver's symbolic value
wasn't being explicitly tracked.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71685 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index c31a8cd53d..e00ede090b 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -439,6 +439,9 @@ public: ObjCSummaryKey(const ObjCInterfaceDecl* d, Selector s) : II(d ? d->getIdentifier() : 0), S(s) {} + + ObjCSummaryKey(const ObjCInterfaceDecl* d, IdentifierInfo *ii, Selector s) + : II(d ? d->getIdentifier() : ii), S(s) {} ObjCSummaryKey(Selector s) : II(0), S(s) {} @@ -1265,7 +1268,7 @@ RetainSummaryManager::getInstanceMethodSummary(Selector S, updateSummaryFromAnnotations(*Summ, MD); // Memoize the summary. - ObjCMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ; + ObjCMethodSummaries[ObjCSummaryKey(ID, ClsName, S)] = Summ; return Summ; } @@ -1288,7 +1291,7 @@ RetainSummaryManager::getClassMethodSummary(Selector S, IdentifierInfo *ClsName, updateSummaryFromAnnotations(*Summ, MD); // Memoize the summary. - ObjCClassMethodSummaries[ObjCSummaryKey(ClsName, S)] = Summ; + ObjCClassMethodSummaries[ObjCSummaryKey(ID, ClsName, S)] = Summ; return Summ; } @@ -2926,7 +2929,7 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst, if (Expr* Receiver = ME->getReceiver()) { // We need the type-information of the tracked receiver object // Retrieve it from the state. - ObjCInterfaceDecl* ID = 0; + const ObjCInterfaceDecl* ID = 0; // FIXME: Wouldn't it be great if this code could be reduced? It's just // a chain of lookups. @@ -2948,7 +2951,16 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst, } } } - + + // FIXME: this is a hack. This may or may not be the actual method + // that is called. + if (!ID) { + if (const PointerType *PT = Receiver->getType()->getAsPointerType()) + if (const ObjCInterfaceType *p = + PT->getPointeeType()->getAsObjCInterfaceType()) + ID = p->getDecl(); + } + // FIXME: The receiver could be a reference to a class, meaning that // we should use the class method. Summ = Summaries.getInstanceMethodSummary(ME, ID); |