summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GRState.h2
-rw-r--r--clang/include/clang/Analysis/PathSensitive/Store.h35
-rw-r--r--clang/lib/Analysis/BasicStore.cpp32
3 files changed, 40 insertions, 29 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/GRState.h b/clang/include/clang/Analysis/PathSensitive/GRState.h
index 27df2bbdb67..59de60084d6 100644
--- a/clang/include/clang/Analysis/PathSensitive/GRState.h
+++ b/clang/include/clang/Analysis/PathSensitive/GRState.h
@@ -474,7 +474,7 @@ public:
}
SVal GetSVal(const GRState* state, const MemRegion* R) {
- return StoreMgr->GetRegionSVal(state, R);
+ return StoreMgr->Retrieve(state, loc::MemRegionVal(R));
}
const GRState* BindLoc(const GRState* St, Loc LV, SVal V) {
diff --git a/clang/include/clang/Analysis/PathSensitive/Store.h b/clang/include/clang/Analysis/PathSensitive/Store.h
index be8ee458cb9..b43699e72bf 100644
--- a/clang/include/clang/Analysis/PathSensitive/Store.h
+++ b/clang/include/clang/Analysis/PathSensitive/Store.h
@@ -47,18 +47,29 @@ protected:
public:
virtual ~StoreManager() {}
- /// Retrieve - Retrieves the value bound to specified location. The optional
- /// QualType information provides a hint to the store indicating the expected
- /// type of the returned value.
- virtual SVal Retrieve(const GRState* state, Loc LV, QualType T=QualType()) =0;
-
- /// GetRegionSVal - Retrieves the value bound to the specified region.
- SVal GetRegionSVal(const GRState* state, const MemRegion* R) {
- return Retrieve(state, loc::MemRegionVal(R));
- }
-
- /// Bind value V to location L.
- virtual const GRState* Bind(const GRState* St, Loc L, SVal V) = 0;
+ /// Return the value bound to specified location in a given state.
+ /// \param[in] state The analysis state.
+ /// \param[in] loc The symbolic memory location.
+ /// \param[in] T An optional type that provides a hint indicating the
+ /// expected type of the returned value. This is used if the value is
+ /// lazily computed.
+ /// \return The value bound to the location \c loc.
+ virtual SVal Retrieve(const GRState* state, Loc loc,
+ QualType T = QualType()) = 0;
+
+// /// Retrieves the value bound to the specified region.
+// SVal GetRegionSVal(const GRState* state, const MemRegion* R) {
+// return Retrieve(state, loc::MemRegionVal(R));
+// }
+
+ /// Return a state with the specified value bound to the given location.
+ /// \param[in] state The analysis state.
+ /// \param[in] loc The symbolic memory location.
+ /// \param[in] val The value to bind to location \c loc.
+ /// \return A pointer to a GRState object that contains the same bindings as
+ /// \c state with the addition of having the value specified by \c val bound
+ /// to the location given for \c loc.
+ virtual const GRState* Bind(const GRState* state, Loc loc, SVal val) = 0;
virtual Store Remove(Store St, Loc L) = 0;
diff --git a/clang/lib/Analysis/BasicStore.cpp b/clang/lib/Analysis/BasicStore.cpp
index 9e469c0b5dc..b223114a51d 100644
--- a/clang/lib/Analysis/BasicStore.cpp
+++ b/clang/lib/Analysis/BasicStore.cpp
@@ -37,7 +37,7 @@ public:
~BasicStoreManager() {}
- SVal Retrieve(const GRState *state, Loc LV, QualType T);
+ SVal Retrieve(const GRState *state, Loc loc, QualType T = QualType());
const GRState* Bind(const GRState* St, Loc L, SVal V) {
Store store = St->getStore();
@@ -45,8 +45,8 @@ public:
return StateMgr.MakeStateWithStore(St, store);
}
- Store BindInternal(Store St, Loc LV, SVal V);
- Store Remove(Store St, Loc LV);
+ Store BindInternal(Store St, Loc loc, SVal V);
+ Store Remove(Store St, Loc loc);
Store getInitialStore();
// FIXME: Investigate what is using this. This method should be removed.
@@ -263,18 +263,18 @@ SVal BasicStoreManager::getLValueElement(const GRState* St, SVal Base,
return UnknownVal();
}
-SVal BasicStoreManager::Retrieve(const GRState* state, Loc LV, QualType T) {
+SVal BasicStoreManager::Retrieve(const GRState* state, Loc loc, QualType T) {
- if (isa<UnknownVal>(LV))
+ if (isa<UnknownVal>(loc))
return UnknownVal();
- assert (!isa<UndefinedVal>(LV));
+ assert (!isa<UndefinedVal>(loc));
- switch (LV.getSubKind()) {
+ switch (loc.getSubKind()) {
case loc::MemRegionKind: {
const VarRegion* R =
- dyn_cast<VarRegion>(cast<loc::MemRegionVal>(LV).getRegion());
+ dyn_cast<VarRegion>(cast<loc::MemRegionVal>(loc).getRegion());
if (!R)
return UnknownVal();
@@ -294,7 +294,7 @@ SVal BasicStoreManager::Retrieve(const GRState* state, Loc LV, QualType T) {
// invalidate their bindings). Just return Undefined.
return UndefinedVal();
case loc::FuncValKind:
- return LV;
+ return loc;
default:
assert (false && "Invalid Loc.");
@@ -304,11 +304,11 @@ SVal BasicStoreManager::Retrieve(const GRState* state, Loc LV, QualType T) {
return UnknownVal();
}
-Store BasicStoreManager::BindInternal(Store store, Loc LV, SVal V) {
- switch (LV.getSubKind()) {
+Store BasicStoreManager::BindInternal(Store store, Loc loc, SVal V) {
+ switch (loc.getSubKind()) {
case loc::MemRegionKind: {
const VarRegion* R =
- dyn_cast<VarRegion>(cast<loc::MemRegionVal>(LV).getRegion());
+ dyn_cast<VarRegion>(cast<loc::MemRegionVal>(loc).getRegion());
if (!R)
return store;
@@ -324,11 +324,11 @@ Store BasicStoreManager::BindInternal(Store store, Loc LV, SVal V) {
}
}
-Store BasicStoreManager::Remove(Store store, Loc LV) {
- switch (LV.getSubKind()) {
+Store BasicStoreManager::Remove(Store store, Loc loc) {
+ switch (loc.getSubKind()) {
case loc::MemRegionKind: {
const VarRegion* R =
- dyn_cast<VarRegion>(cast<loc::MemRegionVal>(LV).getRegion());
+ dyn_cast<VarRegion>(cast<loc::MemRegionVal>(loc).getRegion());
if (!R)
return store;
@@ -379,7 +379,7 @@ BasicStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
break;
Marked.insert(R);
- SVal X = GetRegionSVal(state, R);
+ SVal X = Retrieve(state, loc::MemRegionVal(R));
// FIXME: We need to handle symbols nested in region definitions.
for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
OpenPOWER on IntegriCloud