forked from OSchip/llvm-project
Fixed analyzer caching bug involving the transfer function for loads.
llvm-svn: 55494
This commit is contained in:
parent
8c8616377d
commit
f1b9209a34
|
@ -230,7 +230,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeTy* MakeNode(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
|
NodeTy* MakeNode(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
|
||||||
NodeTy* Pred, const StateTy* St) {
|
NodeTy* Pred, const StateTy* St,
|
||||||
|
ProgramPoint::Kind K = ProgramPoint::PostStmtKind) {
|
||||||
|
|
||||||
const StateTy* PredState = GetState(Pred);
|
const StateTy* PredState = GetState(Pred);
|
||||||
|
|
||||||
|
@ -240,7 +241,7 @@ public:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeTy* N = generateNode(S, St, Pred);
|
NodeTy* N = generateNode(S, St, Pred, K);
|
||||||
|
|
||||||
if (N) {
|
if (N) {
|
||||||
if (BuildSinks)
|
if (BuildSinks)
|
||||||
|
|
|
@ -442,9 +442,10 @@ protected:
|
||||||
return StateMgr.Assume(St, Cond, Assumption, isFeasible);
|
return StateMgr.Assume(St, Cond, Assumption, isFeasible);
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeTy* MakeNode(NodeSet& Dst, Stmt* S, NodeTy* Pred, const GRState* St) {
|
NodeTy* MakeNode(NodeSet& Dst, Stmt* S, NodeTy* Pred, const GRState* St,
|
||||||
|
ProgramPoint::Kind K = ProgramPoint::PostStmtKind) {
|
||||||
assert (Builder && "GRStmtNodeBuilder not present.");
|
assert (Builder && "GRStmtNodeBuilder not present.");
|
||||||
return Builder->MakeNode(Dst, S, Pred, St);
|
return Builder->MakeNode(Dst, S, Pred, St, K);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Visit - Transfer function logic for all statements. Dispatches to
|
/// Visit - Transfer function logic for all statements. Dispatches to
|
||||||
|
|
|
@ -954,22 +954,23 @@ void GRExprEngine::EvalLoad(NodeSet& Dst, Expr* Ex, NodeTy* Pred,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Proceed with the load.
|
// Proceed with the load.
|
||||||
|
ProgramPoint::Kind K = ProgramPoint::PostLoadKind;
|
||||||
|
|
||||||
// FIXME: Currently symbolic analysis "generates" new symbols
|
// FIXME: Currently symbolic analysis "generates" new symbols
|
||||||
// for the contents of values. We need a better approach.
|
// for the contents of values. We need a better approach.
|
||||||
|
|
||||||
// FIXME: The "CheckOnly" option exists only because Array and Field
|
// FIXME: The "CheckOnly" option exists only because Array and Field
|
||||||
// loads aren't fully implemented. Eventually this option will go away.
|
// loads aren't fully implemented. Eventually this option will go away.
|
||||||
|
|
||||||
if (CheckOnly)
|
if (CheckOnly)
|
||||||
MakeNode(Dst, Ex, Pred, St);
|
MakeNode(Dst, Ex, Pred, St, K);
|
||||||
else if (location.isUnknown()) {
|
else if (location.isUnknown()) {
|
||||||
// This is important. We must nuke the old binding.
|
// This is important. We must nuke the old binding.
|
||||||
MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, UnknownVal()));
|
MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, UnknownVal()), K);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, GetRVal(St, cast<LVal>(location),
|
MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, GetRVal(St, cast<LVal>(location),
|
||||||
Ex->getType())));
|
Ex->getType())), K);
|
||||||
}
|
}
|
||||||
|
|
||||||
const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
|
const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
|
||||||
|
|
Loading…
Reference in New Issue