aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/GRExprEngine.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-30 04:23:07 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-30 04:23:07 +0000
commit436f2b9a7955203d2124b327df7b47ff33a58b89 (patch)
treea46de50bf1cfdaa4e4f64a53a663e59a10f814c9 /lib/Analysis/GRExprEngine.cpp
parentad87d25ef55c7cf8984b5557aa235f3884adb141 (diff)
Invalidate old subexpression bindings when binding UnknownVal.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50466 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r--lib/Analysis/GRExprEngine.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index a7b31d5b6d..d9a2313aa1 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -157,7 +157,7 @@ ValueState* GRExprEngine::SetRVal(ValueState* St, Expr* Ex, RVal V) {
return St;
}
- return StateMgr.SetRVal(St, Ex, V, isBlkExpr, false);
+ return StateMgr.SetRVal(St, Ex, V, isBlkExpr, true);
}
//===----------------------------------------------------------------------===//
@@ -890,8 +890,12 @@ void GRExprEngine::EvalLoad(NodeSet& Dst, Expr* Ex, NodeTy* Pred,
// FIXME: The "CheckOnly" option exists only because Array and Field
// loads aren't fully implemented. Eventually this option will go away.
- if (location.isUnknown() || CheckOnly)
+ if (CheckOnly)
MakeNode(Dst, Ex, Pred, St);
+ else if (location.isUnknown()) {
+ // This is important. We must nuke the old binding.
+ MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, UnknownVal()));
+ }
else
MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, GetRVal(St, cast<LVal>(location),
Ex->getType())));
@@ -1593,7 +1597,7 @@ void GRExprEngine::VisitUnaryOperator(UnaryOperator* U, NodeTy* Pred,
St = SetRVal(St, U, U->isPostfix() ? V2 : Result);
// Perform the store.
- EvalStore(Dst, U, *I, St, V1, Result);
+ EvalStore(Dst, U, *I2, St, V1, Result);
}
}
}