diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-12 19:18:35 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-12 19:18:35 +0000 |
commit | 42577d145e2c6c3f77731645d442faa716f4c852 (patch) | |
tree | 628f564ac0c50efee088c8c215d4973d47be5e45 | |
parent | eb8f3063257a392f15aea48d42fb73ec51afc548 (diff) |
StoreManager::BindDecl now takes an SVal* for the initialization value instead of an Expr* (which can be null). Lazy symbolication of conjured symbols is now the sole responsibility of GRExprEngine.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59151 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/PathSensitive/Store.h | 6 | ||||
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 27 | ||||
-rw-r--r-- | lib/Analysis/RegionStore.cpp | 38 |
3 files changed, 25 insertions, 46 deletions
diff --git a/include/clang/Analysis/PathSensitive/Store.h b/include/clang/Analysis/PathSensitive/Store.h index 7b6bf1e1d2..5ec732fda8 100644 --- a/include/clang/Analysis/PathSensitive/Store.h +++ b/include/clang/Analysis/PathSensitive/Store.h @@ -91,10 +91,8 @@ public: llvm::SmallVectorImpl<const MemRegion*>& RegionRoots, LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols) = 0; - virtual Store BindDecl(Store store, - const VarDecl* VD, Expr* Ex, - SVal InitVal = UndefinedVal(), - unsigned Count = 0) = 0; + virtual Store BindDecl(Store store, const VarDecl* VD, SVal* InitVal, + unsigned Count) = 0; virtual void print(Store store, std::ostream& Out, const char* nl, const char *sep) = 0; diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index be9f4fdd12..16c35ea7ac 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -76,8 +76,7 @@ public: void iterBindings(Store store, BindingsHandler& f); - Store BindDecl(Store store, const VarDecl* VD, Expr* Ex, - SVal InitVal = UndefinedVal(), unsigned Count = 0); + Store BindDecl(Store store, const VarDecl* VD, SVal* InitVal, unsigned Count); static inline VarBindingsTy GetVarBindings(Store store) { return VarBindingsTy(static_cast<const VarBindingsTy::TreeTy*>(store)); @@ -358,11 +357,11 @@ Store BasicStoreManager::getInitialStore() { return St; } -Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, - SVal InitVal, unsigned Count) { +Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, + SVal* InitVal, unsigned Count) { + BasicValueFactory& BasicVals = StateMgr.getBasicVals(); - SymbolManager& SymMgr = StateMgr.getSymbolManager(); - + // BasicStore does not model arrays and structs. if (VD->getType()->isArrayType() || VD->getType()->isStructureType()) return store; @@ -386,7 +385,7 @@ Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, // —if it has pointer type, it is initialized to a null pointer; // —if it has arithmetic type, it is initialized to (positive or // unsigned) zero; - if (!Ex) { + if (!InitVal) { QualType T = VD->getType(); if (Loc::IsLocType(T)) store = Bind(store, getLoc(VD), @@ -398,24 +397,14 @@ Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, // assert(0 && "ignore other types of variables"); } } else { - store = Bind(store, getLoc(VD), InitVal); + store = Bind(store, getLoc(VD), *InitVal); } } } else { // Process local scalar variables. QualType T = VD->getType(); if (Loc::IsLocType(T) || T->isIntegerType()) { - SVal V = Ex ? InitVal : UndefinedVal(); - - if (Ex && InitVal.isUnknown()) { - // EXPERIMENTAL: "Conjured" symbols. - SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count); - - V = Loc::IsLocType(Ex->getType()) - ? cast<SVal>(loc::SymbolVal(Sym)) - : cast<SVal>(nonloc::SymbolVal(Sym)); - } - + SVal V = InitVal ? *InitVal : UndefinedVal(); store = Bind(store, getLoc(VD), V); } } diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index 8372a1023e..ba73761ad9 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -85,8 +85,7 @@ public: llvm::SmallVectorImpl<const MemRegion*>& RegionRoots, LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols); - Store BindDecl(Store store, const VarDecl* VD, Expr* Ex, SVal InitVal, - unsigned Count); + Store BindDecl(Store store, const VarDecl* VD, SVal* InitVal, unsigned Count); static inline RegionBindingsTy GetRegionBindings(Store store) { return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store)); @@ -356,10 +355,10 @@ Store RegionStoreManager::getInitialStore() { return St; } -Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, - SVal InitVal, unsigned Count) { +Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, + SVal* InitVal, unsigned Count) { + BasicValueFactory& BasicVals = StateMgr.getBasicVals(); - SymbolManager& SymMgr = StateMgr.getSymbolManager(); if (VD->hasGlobalStorage()) { // Static global variables should not be visited here. @@ -367,7 +366,7 @@ Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, VD->isFileVarDecl())); // Process static variables. if (VD->getStorageClass() == VarDecl::Static) { - if (!Ex) { + if (!InitVal) { // Only handle pointer and integer static variables. QualType T = VD->getType(); @@ -382,7 +381,7 @@ Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, // Other types of static local variables are not handled yet. } else { - store = Bind(store, getVarLoc(VD), InitVal); + store = Bind(store, getVarLoc(VD), *InitVal); } } } else { @@ -393,27 +392,20 @@ Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, VarRegion* VR = MRMgr.getVarRegion(VD); if (Loc::IsLocType(T) || T->isIntegerType()) { - SVal V = Ex ? InitVal : UndefinedVal(); - if (Ex && InitVal.isUnknown()) { - // "Conjured" symbols. - SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count); - V = Loc::IsLocType(Ex->getType()) - ? cast<SVal>(loc::SymbolVal(Sym)) - : cast<SVal>(nonloc::SymbolVal(Sym)); - } + SVal V = InitVal ? *InitVal : UndefinedVal(); store = Bind(store, loc::MemRegionVal(VR), V); - - } else if (T->isArrayType()) { - if (!Ex) + } + else if (T->isArrayType()) { + if (!InitVal) store = BindArrayToVal(store, VR, UndefinedVal()); else - store = InitializeArray(store, VR, InitVal); - - } else if (T->isStructureType()) { - if (!Ex) + store = InitializeArray(store, VR, *InitVal); + } + else if (T->isStructureType()) { + if (!InitVal) store = BindStructToVal(store, VR, UndefinedVal()); else - store = InitializeStruct(store, VR, InitVal); + store = InitializeStruct(store, VR, *InitVal); } // Other types of local variables are not handled yet. |