diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-02-26 19:40:44 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-02-26 19:40:44 +0000 |
| commit | bc54390803aeaea1866c38bcc5ab1fedabc7de67 (patch) | |
| tree | d1fe8bc692e01a2a1bb0a24ede36aeae270a1988 | |
| parent | a736c001b6086d419290fe4decc01dad79b4d37b (diff) | |
| download | bcm5719-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.cpp | 11 | ||||
| -rw-r--r-- | clang/Analysis/ValueState.cpp | 8 |
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: { |

