Added method "getSelfRegion" to Store. This method returns the region associated with the "this" or "self" object (C++ and Objective-C respectively).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58107 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/BasicObjCFoundationChecks.cpp b/lib/Analysis/BasicObjCFoundationChecks.cpp
index 96a7ea1..033dc02 100644
--- a/lib/Analysis/BasicObjCFoundationChecks.cpp
+++ b/lib/Analysis/BasicObjCFoundationChecks.cpp
@@ -508,7 +508,7 @@
return false;
- QualType T = Ctx.getCanonicalType(R->getType());
+ QualType T = Ctx.getCanonicalType(R->getType(Ctx));
// FIXME: If the pointee isn't an integer type, should we flag a warning?
// People can do weird stuff with pointers.
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index 70631ac..e12b9ea 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -27,20 +27,19 @@
VarBindingsTy::Factory VBFactory;
GRStateManager& StateMgr;
MemRegionManager MRMgr;
+ const MemRegion* SelfRegion;
public:
BasicStoreManager(GRStateManager& mgr)
- : StateMgr(mgr), MRMgr(StateMgr.getAllocator()) {}
+ : StateMgr(mgr), MRMgr(StateMgr.getAllocator()), SelfRegion(0) {}
- virtual ~BasicStoreManager() {}
+ ~BasicStoreManager() {}
- virtual SVal Retrieve(Store St, Loc LV, QualType T);
- virtual Store Bind(Store St, Loc LV, SVal V);
- virtual Store Remove(Store St, Loc LV);
-
- virtual Store getInitialStore();
-
- virtual MemRegionManager& getRegionManager() { return MRMgr; }
+ SVal Retrieve(Store St, Loc LV, QualType T);
+ Store Bind(Store St, Loc LV, SVal V);
+ Store Remove(Store St, Loc LV);
+ Store getInitialStore();
+ MemRegionManager& getRegionManager() { return MRMgr; }
// FIXME: Investigate what is using this. This method should be removed.
virtual Loc getLoc(const VarDecl* VD) {
@@ -52,26 +51,31 @@
SVal getLValueField(const GRState* St, SVal Base, const FieldDecl* D);
SVal getLValueElement(const GRState* St, SVal Base, SVal Offset);
+ /// ArrayToPointer - Used by GRExprEngine::VistCast to handle implicit
+ /// conversions between arrays and pointers.
SVal ArrayToPointer(SVal Array) { return Array; }
- virtual Store
- RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live,
- llvm::SmallVectorImpl<const MemRegion*>& RegionRoots,
- LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols);
+ /// getSelfRegion - Returns the region for the 'self' (Objective-C) or
+ /// 'this' object (C++). When used when analyzing a normal function this
+ /// method returns NULL.
+ const MemRegion* getSelfRegion(Store) {
+ return SelfRegion;
+ }
+
+ Store RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live,
+ llvm::SmallVectorImpl<const MemRegion*>& RegionRoots,
+ LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols);
- virtual void iterBindings(Store store, BindingsHandler& f);
+ void iterBindings(Store store, BindingsHandler& f);
- virtual Store AddDecl(Store store,
- const VarDecl* VD, Expr* Ex,
- SVal InitVal = UndefinedVal(), unsigned Count = 0);
+ Store AddDecl(Store store, const VarDecl* VD, Expr* Ex,
+ SVal InitVal = UndefinedVal(), unsigned Count = 0);
static inline VarBindingsTy GetVarBindings(Store store) {
return VarBindingsTy(static_cast<const VarBindingsTy::TreeTy*>(store));
}
- virtual void print(Store store, std::ostream& Out,
- const char* nl, const char *sep);
-
+ void print(Store store, std::ostream& Out, const char* nl, const char *sep);
};
} // end anonymous namespace
@@ -291,6 +295,7 @@
}
Store BasicStoreManager::getInitialStore() {
+
// The LiveVariables information already has a compilation of all VarDecls
// used in the function. Iterate through this set, and "symbolicate"
// any VarDecl whose value originally comes from outside the function.
@@ -303,7 +308,22 @@
for (LVDataTy::decl_iterator I=D.begin_decl(), E=D.end_decl(); I != E; ++I) {
NamedDecl* ND = const_cast<NamedDecl*>(I->first);
- if (VarDecl* VD = dyn_cast<VarDecl>(ND)) {
+ // Handle implicit parameters.
+ if (ImplicitParamDecl* PD = dyn_cast<ImplicitParamDecl>(ND)) {
+ const Decl& CD = StateMgr.getCodeDecl();
+ if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(&CD)) {
+ if (MD->getSelfDecl() == PD) {
+ // Create a region for "self".
+ assert (SelfRegion == 0);
+ SelfRegion = MRMgr.getObjCObjectRegion(MD->getClassInterface(),
+ MRMgr.getHeapRegion());
+
+ St = Bind(St, loc::MemRegionVal(MRMgr.getVarRegion(PD)),
+ loc::MemRegionVal(SelfRegion));
+ }
+ }
+ }
+ else if (VarDecl* VD = dyn_cast<VarDecl>(ND)) {
// Punt on static variables for now.
if (VD->getStorageClass() == VarDecl::Static)
continue;
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 996fea9..acfd7a1 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -122,7 +122,7 @@
Liveness(L),
Builder(NULL),
StateMgr(G.getContext(), SMC,
- CreateBasicConstraintManager, G.getAllocator(), G.getCFG(), L),
+ CreateBasicConstraintManager, G.getAllocator(), cfg, CD, L),
SymMgr(StateMgr.getSymbolManager()),
CurrentStmt(NULL),
NSExceptionII(NULL), NSExceptionInstanceRaiseSelectors(NULL),
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index 5c75ab3..e2b6b13 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/lib/Analysis/RegionStore.cpp
@@ -66,6 +66,14 @@
}
Store getInitialStore();
+
+ /// getSelfRegion - Returns the region for the 'self' (Objective-C) or
+ /// 'this' object (C++). When used when analyzing a normal function this
+ /// method returns NULL.
+ const MemRegion* getSelfRegion(Store) {
+ assert (false && "Not implemented.");
+ return 0;
+ }
Store RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live,
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots,