]> granicus.if.org Git - clang/commitdiff
Small fixes to shore up overhauling of transfer function logic for '&&' and '||.
authorTed Kremenek <kremenek@apple.com>
Tue, 26 Feb 2008 19:40:44 +0000 (19:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 26 Feb 2008 19:40:44 +0000 (19:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47620 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRExprEngine.cpp
Analysis/ValueState.cpp

index c0f53fe8c70075c841d798650eb40ecf418dff9e..1dae433e8fd7b3819a043c44834b8f5da03e5bad 100644 (file)
@@ -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
index 7f3e733dbb97c269e24eb3681e88a513d8b3c794..b892fd6852429e904e69c8dead23259de6009ed2 100644 (file)
@@ -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: {