aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CFRefCount.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-05-13 18:16:01 +0000
committerTed Kremenek <kremenek@apple.com>2009-05-13 18:16:01 +0000
commit70b6a83b833c40f320d0ed2310cbcdf2be4cece0 (patch)
treebaf9e5059e6bcd28ff207be6e3802563a3312d7e /lib/Analysis/CFRefCount.cpp
parent5b53005fb9ef24b8bdfe995f29b4662de468128a (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.cpp20
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);