[cfe-commits] r48079 - in /cfe/trunk: Analysis/GRExprEngine.cpp Analysis/RValues.cpp Analysis/ValueState.cpp include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/RValues.h

Ted Kremenek kremenek at apple.com
Sat Mar 8 19:30:59 PST 2008


Author: kremenek
Date: Sat Mar  8 21:30:59 2008
New Revision: 48079

URL: http://llvm.org/viewvc/llvm-project?rev=48079&view=rev
Log:
Bug fix: Don't call RemoveDeadBindings more than once (can kill newly generated values to Block-Level Expressions).

Modified:
    cfe/trunk/Analysis/GRExprEngine.cpp
    cfe/trunk/Analysis/RValues.cpp
    cfe/trunk/Analysis/ValueState.cpp
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
    cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h

Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=48079&r1=48078&r2=48079&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Sat Mar  8 21:30:59 2008
@@ -92,6 +92,16 @@
   return StateMgr.SetRVal(St, LV, RV);
 }
 
+ValueState* GRExprEngine::SetBlkExprRVal(ValueState* St, Expr* Ex, RVal V) {
+  
+  if (!StateCleaned) {
+    St = RemoveDeadBindings(CurrentStmt, St);
+    StateCleaned = true;
+  }
+  
+  return StateMgr.SetRVal(St, Ex, V, true, false);
+}
+
 ValueState* GRExprEngine::MarkBranch(ValueState* St, Stmt* Terminator,
                                      bool branchTaken) {
   
@@ -420,7 +430,10 @@
   // dead mappings removed.
   
   if (Dst.size() == 1 && *Dst.begin() == StmtEntryNode) {
-    ValueState* St = RemoveDeadBindings(S, StmtEntryNode->getState());
+    ValueState* St =
+      StateCleaned ? StmtEntryNode->getState() : 
+                     RemoveDeadBindings(S, StmtEntryNode->getState());
+    
     builder.generateNode(S, St, StmtEntryNode);
   }
   
@@ -442,7 +455,9 @@
   // it to the block-level expression.
   
   ValueState* St = Pred->getState();  
-  Nodify(Dst, D, Pred, SetRVal(St, D, GetRVal(St, D)));
+  RVal X = RVal::MakeVal(BasicVals, D);
+  RVal Y = isa<lval::DeclVal>(X) ? GetRVal(St, cast<lval::DeclVal>(X)) : X;
+  Nodify(Dst, D, Pred, SetBlkExprRVal(St, D, Y));
 }
 
 void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
@@ -1709,9 +1724,11 @@
         Out << S->getStmtClassName() << ' ' << (void*) S << ' ';        
         S->printPretty(Out);
         
-        Out << "\\lline="
-          << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
-          << GraphPrintSourceManager->getColumnNumber(SLoc) << "\\l";
+        if (SLoc.isFileID()) {        
+          Out << "\\lline="
+            << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
+            << GraphPrintSourceManager->getColumnNumber(SLoc) << "\\l";          
+        }
         
         if (GraphPrintCheckerState->isImplicitNullDeref(N))
           Out << "\\|Implicit-Null Dereference.\\l";
@@ -1750,9 +1767,11 @@
           
           E.getSrc()->printTerminator(Out);
           
-          Out << "\\lline="
-            << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
-            << GraphPrintSourceManager->getColumnNumber(SLoc);
+          if (SLoc.isFileID()) {
+            Out << "\\lline="
+              << GraphPrintSourceManager->getLineNumber(SLoc) << " col="
+              << GraphPrintSourceManager->getColumnNumber(SLoc);
+          }
             
           if (isa<SwitchStmt>(T)) {
             Stmt* Label = E.getDst()->getLabel();

Modified: cfe/trunk/Analysis/RValues.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/RValues.cpp?rev=48079&r1=48078&r2=48079&view=diff

==============================================================================
--- cfe/trunk/Analysis/RValues.cpp (original)
+++ cfe/trunk/Analysis/RValues.cpp Sat Mar  8 21:30:59 2008
@@ -238,6 +238,36 @@
 LVal LVal::MakeVal(AddrLabelExpr* E) { return lval::GotoLabel(E->getLabel()); }
 
 //===----------------------------------------------------------------------===//
+// Utility methods for constructing RVals (both NonLVals and LVals).
+//===----------------------------------------------------------------------===//
+
+RVal RVal::MakeVal(BasicValueFactory& BasicVals, DeclRefExpr* E) {
+  
+  ValueDecl* D = cast<DeclRefExpr>(E)->getDecl();
+  
+  if (VarDecl* VD = dyn_cast<VarDecl>(D)) {
+    return lval::DeclVal(VD);
+  }
+  else if (EnumConstantDecl* ED = dyn_cast<EnumConstantDecl>(D)) {
+    
+    // FIXME: Do we need to cache a copy of this enum, since it
+    // already has persistent storage?  We do this because we
+    // are comparing states using pointer equality.  Perhaps there is
+    // a better way, since APInts are fairly lightweight.
+    
+    return nonlval::ConcreteInt(BasicVals.getValue(ED->getInitVal()));          
+  }
+  else if (FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) {
+    return lval::FuncVal(FD);
+  }
+  
+  assert (false &&
+          "ValueDecl support for this ValueDecl not implemented.");
+  
+  return UnknownVal();
+}
+
+//===----------------------------------------------------------------------===//
 // Pretty-Printing.
 //===----------------------------------------------------------------------===//
 

Modified: cfe/trunk/Analysis/ValueState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/ValueState.cpp?rev=48079&r1=48078&r2=48079&view=diff

==============================================================================
--- cfe/trunk/Analysis/ValueState.cpp (original)
+++ cfe/trunk/Analysis/ValueState.cpp Sat Mar  8 21:30:59 2008
@@ -232,28 +232,14 @@
         // within the referenced variables.
         
       case Stmt::DeclRefExprClass: {
-        
-        ValueDecl* D = cast<DeclRefExpr>(E)->getDecl();
-        
-        if (VarDecl* VD = dyn_cast<VarDecl>(D)) {          
-          return GetRVal(St, lval::DeclVal(VD));          
-        }
-        else if (EnumConstantDecl* ED = dyn_cast<EnumConstantDecl>(D)) {
-          
-          // FIXME: Do we need to cache a copy of this enum, since it
-          // already has persistent storage?  We do this because we
-          // are comparing states using pointer equality.  Perhaps there is
-          // a better way, since APInts are fairly lightweight.
 
-          return nonlval::ConcreteInt(BasicVals.getValue(ED->getInitVal()));          
-        }
-        else if (FunctionDecl* FD = dyn_cast<FunctionDecl>(D))
-          return lval::FuncVal(FD);
-        
-        assert (false &&
-                "ValueDecl support for this ValueDecl not implemented.");
+        // Check if this expression is a block-level expression.  If so,
+        // return its value.
+        ValueState::ExprBindingsTy::TreeTy* T=St->BlockExprBindings.SlimFind(E);
+        if (T) return T->getValue().second;
         
-        return UnknownVal();
+        RVal X = RVal::MakeVal(BasicVals, cast<DeclRefExpr>(E));
+        return isa<lval::DeclVal>(X) ? GetRVal(St, cast<lval::DeclVal>(X)) : X;
       }
         
       case Stmt::CharacterLiteralClass: {

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=48079&r1=48078&r2=48079&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Sat Mar  8 21:30:59 2008
@@ -275,17 +275,7 @@
     return SetRVal(St, const_cast<Expr*>(Ex), V);
   }
  
-  ValueState* SetBlkExprRVal(ValueState* St, Expr* Ex, RVal V) {
-    return StateMgr.SetRVal(St, Ex, V, true, false);
-  }
-  
-#if 0
-  /// SetRVal - This version of SetRVal is used to batch process a set
-  ///  of different possible RVals and return a set of different states.
-  const ValueState*::BufferTy& SetRVal(ValueState* St, Expr* Ex,
-                                       const RVal::BufferTy& V,
-                                       ValueState*::BufferTy& RetBuf);
-#endif
+  ValueState* SetBlkExprRVal(ValueState* St, Expr* Ex, RVal V);
   
   ValueState* SetRVal(ValueState* St, LVal LV, RVal V);
   

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h?rev=48079&r1=48078&r2=48079&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/RValues.h Sat Mar  8 21:30:59 2008
@@ -90,6 +90,8 @@
   symbol_iterator symbol_begin() const;
   symbol_iterator symbol_end() const;  
   
+  static RVal MakeVal(BasicValueFactory& BasicVals, DeclRefExpr* E);
+  
   // Implement isa<T> support.
   static inline bool classof(const RVal*) { return true; }
 };





More information about the cfe-commits mailing list