summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-26 19:40:44 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-26 19:40:44 +0000
commitbc54390803aeaea1866c38bcc5ab1fedabc7de67 (patch)
treed1fe8bc692e01a2a1bb0a24ede36aeae270a1988
parenta736c001b6086d419290fe4decc01dad79b4d37b (diff)
downloadbcm5719-llvm-bc54390803aeaea1866c38bcc5ab1fedabc7de67.tar.gz
bcm5719-llvm-bc54390803aeaea1866c38bcc5ab1fedabc7de67.zip
Small fixes to shore up overhauling of transfer function logic for '&&' and '||.
llvm-svn: 47620
-rw-r--r--clang/Analysis/GRExprEngine.cpp11
-rw-r--r--clang/Analysis/ValueState.cpp8
2 files changed, 15 insertions, 4 deletions
diff --git a/clang/Analysis/GRExprEngine.cpp b/clang/Analysis/GRExprEngine.cpp
index c0f53fe8c70..1dae433e8fd 100644
--- a/clang/Analysis/GRExprEngine.cpp
+++ b/clang/Analysis/GRExprEngine.cpp
@@ -148,8 +148,8 @@ void GRExprEngine::ProcessBranch(Expr* Condition, Stmt* Term,
break;
case RVal::UnknownKind:
- builder.generateNode(PrevState, true);
- builder.generateNode(PrevState, false);
+ builder.generateNode(MarkBranch(PrevState, Term, true), true);
+ builder.generateNode(MarkBranch(PrevState, Term, false), false);
return;
case RVal::UninitializedKind: {
@@ -368,6 +368,13 @@ void GRExprEngine::VisitLogicalExpr(BinaryOperator* B, NodeTy* Pred,
X = GetBlkExprRVal(St, Ex);
+ // Handle uninitialized values.
+
+ if (X.isUninit()) {
+ Nodify(Dst, B, Pred, SetBlkExprRVal(St, B, X));
+ return;
+ }
+
// We took the RHS. Because the value of the '&&' or '||' expression must
// evaluate to 0 or 1, we must assume the value of the RHS evaluates to 0
// or 1. Alternatively, we could take a lazy approach, and calculate this
diff --git a/clang/Analysis/ValueState.cpp b/clang/Analysis/ValueState.cpp
index 7f3e733dbb9..b892fd68524 100644
--- a/clang/Analysis/ValueState.cpp
+++ b/clang/Analysis/ValueState.cpp
@@ -336,12 +336,16 @@ RVal ValueStateManager::GetRVal(ValueState St, Expr* E) {
ValueState::ExprBindingsTy::TreeTy* T = St->SubExprBindings.SlimFind(E);
- return T ? T->getValue().second : GetBlkExprRVal(St, E);
+ if (T)
+ return T->getValue().second;
+
+ T = St->BlockExprBindings.SlimFind(E);
+ return T ? T->getValue().second : UnknownVal();
}
RVal ValueStateManager::GetBlkExprRVal(ValueState St, Expr* E) {
- assert (!isa<ParenExpr>(E));
+ E = E->IgnoreParens();
switch (E->getStmtClass()) {
case Stmt::CharacterLiteralClass: {
OpenPOWER on IntegriCloud