}
else if (B->getOpcode() == BinaryOperator::Comma) {
const GRState* St = GetState(Pred);
- MakeNode(Dst, B, Pred, SetSVal(St, B, GetSVal(St, B->getRHS())));
+ MakeNode(Dst, B, Pred, BindExpr(St, B, GetSVal(St, B->getRHS())));
break;
}
assert (!SE->getSubStmt()->body_empty());
if (Expr* LastExpr = dyn_cast<Expr>(*SE->getSubStmt()->body_rbegin()))
- MakeNode(Dst, SE, Pred, SetSVal(St, SE, GetSVal(St, LastExpr)));
+ MakeNode(Dst, SE, Pred, BindExpr(St, SE, GetSVal(St, LastExpr)));
else
Dst.Add(Pred);
case Stmt::StringLiteralClass: {
const GRState* St = GetState(Pred);
SVal V = StateMgr.GetLValue(St, cast<StringLiteral>(Ex));
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
return;
}
(Op == BinaryOperator::LOr && !branchTaken)
? B->getRHS() : B->getLHS();
- return SetBlkExprSVal(St, B, UndefinedVal(Ex));
+ return BindBlkExpr(St, B, UndefinedVal(Ex));
}
case Stmt::ConditionalOperatorClass: { // ?:
else
Ex = C->getRHS();
- return SetBlkExprSVal(St, C, UndefinedVal(Ex));
+ return BindBlkExpr(St, C, UndefinedVal(Ex));
}
case Stmt::ChooseExprClass: { // ?:
ChooseExpr* C = cast<ChooseExpr>(Terminator);
Expr* Ex = branchTaken ? C->getLHS() : C->getRHS();
- return SetBlkExprSVal(St, C, UndefinedVal(Ex));
+ return BindBlkExpr(St, C, UndefinedVal(Ex));
}
}
}
X = GetBlkExprSVal(St, SE);
// Make sure that we invalidate the previous binding.
- MakeNode(Dst, Ex, Pred, StateMgr.SetSVal(St, Ex, X, true, true));
+ MakeNode(Dst, Ex, Pred, StateMgr.BindExpr(St, Ex, X, true, true));
}
/// ProcessSwitch - Called by GRCoreEngine. Used to generate successor
// Handle undefined values.
if (X.isUndef()) {
- MakeNode(Dst, B, Pred, SetBlkExprSVal(St, B, X));
+ MakeNode(Dst, B, Pred, BindBlkExpr(St, B, X));
return;
}
if (isFeasible)
MakeNode(Dst, B, Pred,
- SetBlkExprSVal(NewState, B, MakeConstantVal(1U, B)));
+ BindBlkExpr(NewState, B, MakeConstantVal(1U, B)));
isFeasible = false;
NewState = Assume(St, X, false, isFeasible);
if (isFeasible)
MakeNode(Dst, B, Pred,
- SetBlkExprSVal(NewState, B, MakeConstantVal(0U, B)));
+ BindBlkExpr(NewState, B, MakeConstantVal(0U, B)));
}
else {
// We took the LHS expression. Depending on whether we are '&&' or
// the short-circuiting.
X = MakeConstantVal( B->getOpcode() == BinaryOperator::LAnd ? 0U : 1U, B);
- MakeNode(Dst, B, Pred, SetBlkExprSVal(St, B, X));
+ MakeNode(Dst, B, Pred, BindBlkExpr(St, B, X));
}
}
SVal V = StateMgr.GetLValue(St, VD);
if (asLValue)
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
else
EvalLoad(Dst, Ex, Pred, St, V);
return;
BasicValueFactory& BasicVals = StateMgr.getBasicVals();
SVal V = nonloc::ConcreteInt(BasicVals.getValue(ED->getInitVal()));
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
return;
} else if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) {
// FIXME: Does this need to be revised? We were getting cases in
// real code that did this.
SVal V = loc::FuncVal(FD);
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
return;
}
SVal V = StateMgr.GetLValue(St, GetSVal(St, Base), GetSVal(St, Idx));
if (asLValue)
- MakeNode(Dst, A, *I2, SetSVal(St, A, V));
+ MakeNode(Dst, A, *I2, BindExpr(St, A, V));
else
EvalLoad(Dst, A, *I2, St, V);
}
SVal L = StateMgr.GetLValue(St, GetSVal(St, Base), M->getMemberDecl());
if (asLValue)
- MakeNode(Dst, M, *I, SetSVal(St, M, L));
+ MakeNode(Dst, M, *I, BindExpr(St, M, L));
else
EvalLoad(Dst, M, *I, St, L);
}
MakeNode(Dst, Ex, Pred, St, K);
else if (location.isUnknown()) {
// This is important. We must nuke the old binding.
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, UnknownVal()), K);
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, UnknownVal()), K);
}
else
- MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, GetSVal(St, cast<Loc>(location),
- Ex->getType())), K);
+ MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, GetSVal(St, cast<Loc>(location),
+ Ex->getType())), K);
}
void GRExprEngine::EvalStore(NodeSet& Dst, Expr* Ex, Expr* StoreE, NodeTy* Pred,
}
const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
- const GRState* St,
- SVal location, bool isLoad) {
+ const GRState* St,
+ SVal location, bool isLoad) {
// Check for loads/stores from/to undefined values.
if (location.isUndef()) {
// For __builtin_expect, just return the value of the subexpression.
assert (CE->arg_begin() != CE->arg_end());
SVal X = GetSVal(St, *(CE->arg_begin()));
- MakeNode(Dst, CE, *DI, SetSVal(St, CE, X));
+ MakeNode(Dst, CE, *DI, BindExpr(St, CE, X));
continue;
}
SVal location = StateMgr.GetLValue(St, Ex->getDecl(), BaseVal);
if (asLValue)
- MakeNode(Dst, Ex, *I, SetSVal(St, Ex, location));
+ MakeNode(Dst, Ex, *I, BindExpr(St, Ex, location));
else
EvalLoad(Dst, Ex, *I, St, location);
}
// Undefined?
if (V.isUndef()) {
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
continue;
}
if (C.getCanonicalType(T).getUnqualifiedType() ==
C.getCanonicalType(ExTy).getUnqualifiedType()) {
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
continue;
}
// If not, flag an error.
V = nonloc::LocAsInteger::Make(getBasicVals(), cast<Loc>(V), bits);
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
continue;
}
if (nonloc::LocAsInteger *LV = dyn_cast<nonloc::LocAsInteger>(&V)) {
// Just unpackage the lval and return it.
V = LV->getLoc();
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
continue;
}
assert(T->isPointerType() || T->isReferenceType());
V = StateMgr.ArrayToPointer(V);
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
continue;
}
// All other cases.
- MakeNode(Dst, CastE, N, SetSVal(St, CastE, EvalCast(V, CastE->getType())));
+ MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType())));
}
}
assert (!IVals.empty() && "Initializer cannot be empty.");
St = StateMgr.BindCompoundLiteral(St, R, &IVals[0], &IVals[0]+IVals.size());
- MakeNode(Dst, CL, *I, SetSVal(St, CL, loc::MemRegionVal(R)));
+ MakeNode(Dst, CL, *I, BindExpr(St, CL, loc::MemRegionVal(R)));
}
}
StateMgr.getBasicVals());
// Make final state and node.
- state = SetSVal(state, E, V);
+ state = BindExpr(state, E, V);
MakeNode(Dst, E, Pred, state);
return;
Visit(Init, Pred, Tmp);
for (NodeSet::iterator I = Tmp.begin(), EI = Tmp.end(); I != EI; ++I) {
state = GetState(*I);
- MakeNode(Dst, E, *I, SetSVal(state, E, GetSVal(state, Init)));
+ MakeNode(Dst, E, *I, BindExpr(state, E, GetSVal(state, Init)));
}
return;
}
amt = getContext().getTypeAlign(T) / 8;
MakeNode(Dst, Ex, Pred,
- SetSVal(GetState(Pred), Ex,
- NonLoc::MakeVal(getBasicVals(), amt, Ex->getType())));
+ BindExpr(GetState(Pred), Ex,
+ NonLoc::MakeVal(getBasicVals(), amt, Ex->getType())));
}
SVal location = GetSVal(St, Ex);
if (asLValue)
- MakeNode(Dst, U, *I, SetSVal(St, U, location));
+ MakeNode(Dst, U, *I, BindExpr(St, U, location));
else
EvalLoad(Dst, U, *I, St, location);
}
// For all other types, UnaryOperator::Real is an identity operation.
assert (U->getType() == Ex->getType());
const GRState* St = GetState(*I);
- MakeNode(Dst, U, *I, SetSVal(St, U, GetSVal(St, Ex)));
+ MakeNode(Dst, U, *I, BindExpr(St, U, GetSVal(St, Ex)));
}
return;
assert (Ex->getType()->isIntegerType());
const GRState* St = GetState(*I);
SVal X = NonLoc::MakeVal(getBasicVals(), 0, Ex->getType());
- MakeNode(Dst, U, *I, SetSVal(St, U, X));
+ MakeNode(Dst, U, *I, BindExpr(St, U, X));
}
return;
for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
const GRState* St = GetState(*I);
- MakeNode(Dst, U, *I, SetSVal(St, U, GetSVal(St, Ex)));
+ MakeNode(Dst, U, *I, BindExpr(St, U, GetSVal(St, Ex)));
}
return;
for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
const GRState* St = GetState(*I);
SVal V = GetSVal(St, Ex);
- St = SetSVal(St, U, V);
+ St = BindExpr(St, U, V);
MakeNode(Dst, U, *I, St);
}
// V = EvalCast(V, U->getType());
if (V.isUnknownOrUndef()) {
- MakeNode(Dst, U, *I, SetSVal(St, U, V));
+ MakeNode(Dst, U, *I, BindExpr(St, U, V));
continue;
}
case UnaryOperator::Not:
// FIXME: Do we need to handle promotions?
- St = SetSVal(St, U, EvalComplement(cast<NonLoc>(V)));
+ St = BindExpr(St, U, EvalComplement(cast<NonLoc>(V)));
break;
case UnaryOperator::Minus:
// FIXME: Do we need to handle promotions?
- St = SetSVal(St, U, EvalMinus(U, cast<NonLoc>(V)));
+ St = BindExpr(St, U, EvalMinus(U, cast<NonLoc>(V)));
break;
case UnaryOperator::LNot:
if (isa<Loc>(V)) {
loc::ConcreteInt X(getBasicVals().getZeroWithPtrWidth());
SVal Result = EvalBinOp(BinaryOperator::EQ, cast<Loc>(V), X);
- St = SetSVal(St, U, Result);
+ St = BindExpr(St, U, Result);
}
else {
nonloc::ConcreteInt X(getBasicVals().getValue(0, Ex->getType()));
uint64_t size = getContext().getTypeAlign(T) / 8;
const GRState* St = GetState(Pred);
- St = SetSVal(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
+ St = BindExpr(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
MakeNode(Dst, U, Pred, St);
return;
uint64_t size = getContext().getTypeSize(T) / 8;
const GRState* St = GetState(Pred);
- St = SetSVal(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
+ St = BindExpr(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
MakeNode(Dst, U, Pred, St);
return;
// Propagate unknown and undefined values.
if (V2.isUnknownOrUndef()) {
- MakeNode(Dst, U, *I2, SetSVal(St, U, V2));
+ MakeNode(Dst, U, *I2, BindExpr(St, U, V2));
continue;
}
: BinaryOperator::Sub;
SVal Result = EvalBinOp(Op, V2, MakeConstantVal(1U, U));
- St = SetSVal(St, U, U->isPostfix() ? V2 : Result);
+ St = BindExpr(St, U, U->isPostfix() ? V2 : Result);
// Perform the store.
EvalStore(Dst, U, *I2, St, V1, Result);
assert (!isa<NonLoc>(X)); // Should be an Lval, or unknown, undef.
if (isa<Loc>(X))
- St = SetSVal(St, cast<Loc>(X), UnknownVal());
+ St = BindLoc(St, cast<Loc>(X), UnknownVal());
}
MakeNode(Dst, A, Pred, St);
// Simulate the effects of a "store": bind the value of the RHS
// to the L-Value represented by the LHS.
- EvalStore(Dst, B, LHS, *I2, SetSVal(St, B, RightV), LeftV, RightV);
+ EvalStore(Dst, B, LHS, *I2, BindExpr(St, B, RightV), LeftV, RightV);
continue;
}
// Otherwise, create a new node.
- MakeNode(Dst, B, *I2, SetSVal(St, B, Result));
+ MakeNode(Dst, B, *I2, BindExpr(St, B, Result));
continue;
}
}
// Propagate undefined values (left-side).
if (V.isUndef()) {
- EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, V), location, V);
+ EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, V), location, V);
continue;
}
// Propagate unknown values (left and right-side).
if (RightV.isUnknown() || V.isUnknown()) {
- EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, UnknownVal()), location,
+ EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, UnknownVal()), location,
UnknownVal());
continue;
}
// Evaluate operands and promote to result type.
if (RightV.isUndef()) {
// Propagate undefined values (right-side).
- EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, RightV), location, RightV);
+ EvalStore(Dst,B, LHS, *I3, BindExpr(St, B, RightV), location, RightV);
continue;
}
: cast<SVal>(nonloc::SymbolVal(Sym));
}
- EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, Result), location, Result);
+ EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, Result), location, Result);
}
}
}