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;
~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();
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.
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();
// invalidate their bindings). Just return Undefined.
return UndefinedVal();
case loc::FuncValKind:
- return LV;
+ return loc;
default:
assert (false && "Invalid Loc.");
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;
}
}
-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;
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)