}
void print(Store store, std::ostream& Out, const char* nl, const char *sep);
+
+private:
+ ASTContext& getContext() { return StateMgr.getContext(); }
};
} // end anonymous namespace
break;
}
- // FIXME: Handle SymbolRegions? Shouldn't be possible in
- // BasicStoreManager.
- assert(!isa<SymbolicRegion>(R));
+ if (const SymbolicRegion* SR = dyn_cast<SymbolicRegion>(R)) {
+ SymbolRef Sym = SR->getSymbol();
+ BaseR = MRMgr.getTypedViewRegion(Sym->getType(getContext()), SR);
+ }
break;
}
SelfRegion);
SVal X = SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(),
- IVR);
+ MRMgr, IVR);
St = BindInternal(St, Loc::MakeVal(IVR), X);
}
const MemRegion *R = StateMgr.getRegion(VD);
SVal X = (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD) ||
isa<ImplicitParamDecl>(VD))
- ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), R)
+ ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), MRMgr,R)
: UndefinedVal();
St = BindInternal(St, Loc::MakeVal(R), X);
bool isFeasibleNull = false;
GRStateRef StNull = GRStateRef(Assume(state, LV, false, isFeasibleNull),
getStateManager());
-
+
if (isFeasibleNull) {
// Use the Generic Data Map to mark in the state what lval was null.
// to a desugared type.
assert(Loc::IsLocType(T));
- assert(Loc::IsLocType(ExTy));
+ // We get a symbolic function pointer for a dereference of a function
+ // pointer, but it is of function type. Example:
+
+ // struct FPRec {
+ // void (*my_func)(int * x);
+ // };
+ //
+ // int bar(int x);
+ //
+ // int f1_a(struct FPRec* foo) {
+ // int x;
+ // (*foo->my_func)(&x);
+ // return bar(x)+1; // no-warning
+ // }
+
+ assert(Loc::IsLocType(ExTy) || ExTy->isFunctionType());
const MemRegion* R = RV->getRegion();
StoreManager& StoreMgr = getStoreManager();
switch (BaseL.getSubKind()) {
case loc::MemRegionKind:
BaseR = cast<loc::MemRegionVal>(BaseL).getRegion();
+ if (const SymbolicRegion* SR = dyn_cast<SymbolicRegion>(BaseR)) {
+ SymbolRef Sym = SR->getSymbol();
+ BaseR = MRMgr.getTypedViewRegion(Sym->getType(getContext()), SR);
+ }
break;
case loc::SymbolValKind: {
const TypedRegion* BaseRegion = 0;
if (isa<loc::SymbolVal>(Base)) {
+ // FIXME: This case will be removed.
SymbolRef Sym = cast<loc::SymbolVal>(Base).getSymbol();
SymbolicRegion* SR = MRMgr.getSymbolicRegion(Sym);
// Layer the type information.
BaseRegion = MRMgr.getTypedViewRegion(Sym->getType(getContext()), SR);
- }
- else
- BaseRegion = cast<TypedRegion>(cast<loc::MemRegionVal>(Base).getRegion());
+ } else {
+ const MemRegion* R = cast<loc::MemRegionVal>(Base).getRegion();
+ if (const SymbolicRegion* SR = dyn_cast<SymbolicRegion>(R)) {
+ SymbolRef Sym = SR->getSymbol();
+ BaseRegion = MRMgr.getTypedViewRegion(Sym->getType(getContext()), SR);
+ }
+ else
+ BaseRegion = cast<TypedRegion>(R);
+ }
// Pointer of any type can be cast and used as array base.
const ElementRegion *ElemR = dyn_cast<ElementRegion>(BaseRegion);
if (!isa<loc::MemRegionVal>(L))
return UnknownVal();
- const TypedRegion* TR
- = cast<TypedRegion>(cast<loc::MemRegionVal>(L).getRegion());
+ const MemRegion* MR = cast<loc::MemRegionVal>(L).getRegion();
+ if (isa<SymbolicRegion>(MR))
+ return UnknownVal();
+
+ const TypedRegion* TR = cast<TypedRegion>(MR);
const ElementRegion* ER = dyn_cast<ElementRegion>(TR);
if (isa<loc::FuncVal>(L))
return L;
+ const MemRegion* MR = cast<loc::MemRegionVal>(L).getRegion();
+
+ // We return unknown for symbolic region for now. This might be improved.
+ // Example:
+ // void f(int* p) { int x = *p; }
+ if (isa<SymbolicRegion>(MR))
+ return UnknownVal();
+
// FIXME: Perhaps this method should just take a 'const MemRegion*' argument
// instead of 'Loc', and have the other Loc cases handled at a higher level.
- const TypedRegion* R
- = cast<TypedRegion>(cast<loc::MemRegionVal>(L).getRegion());
+ const TypedRegion* R = cast<TypedRegion>(MR);
assert(R && "bad region");
// FIXME: We should eventually handle funny addressing. e.g.:
if (SR == SelfRegion) {
// FIXME: Do we need to handle the case where the super region
// has a view? We want to canonicalize the bindings.
- return SVal::GetRValueSymbolVal(getSymbolManager(), R);
+ return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
}
// Otherwise, we need a new symbol. For now return Unknown.
VD->hasGlobalStorage()) {
QualType VTy = VD->getType();
if (Loc::IsLocType(VTy) || VTy->isIntegerType())
- return SVal::GetRValueSymbolVal(getSymbolManager(), VR);
+ return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, VR);
else
return UnknownVal();
}
// All other integer values are symbolic.
if (Loc::IsLocType(RTy) || RTy->isIntegerType())
- return SVal::GetRValueSymbolVal(getSymbolManager(), R);
+ return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
else
return UnknownVal();
}
if (MRMgr.onStack(FR) || MRMgr.onHeap(FR))
FieldValue = UndefinedVal();
else
- FieldValue = SVal::GetRValueSymbolVal(getSymbolManager(), FR);
+ FieldValue = SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, FR);
}
StructVal = getBasicVals().consVals(FieldValue, StructVal);