]> granicus.if.org Git - clang/commitdiff
Use GRTransferFuncs::EvalBind when processing variable initializations.
authorTed Kremenek <kremenek@apple.com>
Sat, 14 Feb 2009 01:54:57 +0000 (01:54 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 14 Feb 2009 01:54:57 +0000 (01:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64527 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/GRExprEngine.cpp

index f0e93de2193714ee3bd6150cc1a454e725cc9ce4..9b02af44e1e2d9baf9eb7c0a1737d59c261839a8 100644 (file)
@@ -1794,28 +1794,6 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
     const GRState* state = GetState(*I);
     unsigned Count = Builder->getCurrentBlockCount();
 
-    // Decls without InitExpr are not initialized explicitly.
-    if (InitEx) {
-      SVal InitVal = GetSVal(state, InitEx);
-      QualType T = VD->getType();
-      
-      // Recover some path-sensitivity if a scalar value evaluated to
-      // UnknownVal.
-      if (InitVal.isUnknown()) {
-        if (Loc::IsLocType(T)) {
-          SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);        
-          InitVal = loc::SymbolVal(Sym);
-        }
-        else if (T->isIntegerType() && T->isScalarType()) {
-          SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);        
-          InitVal = nonloc::SymbolVal(Sym);                    
-        }
-      }        
-      
-      state = StateMgr.BindDecl(state, VD, InitVal);
-    } else
-      state = StateMgr.BindDeclWithNoInit(state, VD);
-    
     // Check if 'VD' is a VLA and if so check if has a non-zero size.
     QualType T = getContext().getCanonicalType(VD->getType());
     if (VariableArrayType* VLA = dyn_cast<VariableArrayType>(T)) {
@@ -1831,10 +1809,10 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
         }
         continue;
       }
-
+      
       bool isFeasibleZero = false;
       const GRState* ZeroSt =  Assume(state, Size, false, isFeasibleZero);
-            
+      
       bool isFeasibleNotZero = false;
       state = Assume(state, Size, true, isFeasibleNotZero);
       
@@ -1849,8 +1827,38 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
       if (!isFeasibleNotZero)
         continue;      
     }
-
-    MakeNode(Dst, DS, *I, state);
+    
+    // Decls without InitExpr are not initialized explicitly.
+    if (InitEx) {
+      SVal InitVal = GetSVal(state, InitEx);
+      QualType T = VD->getType();
+      
+      // Recover some path-sensitivity if a scalar value evaluated to
+      // UnknownVal.
+      if (InitVal.isUnknown()) {
+        if (Loc::IsLocType(T)) {
+          SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);        
+          InitVal = loc::SymbolVal(Sym);
+        }
+        else if (T->isIntegerType() && T->isScalarType()) {
+          SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);        
+          InitVal = nonloc::SymbolVal(Sym);                    
+        }
+      }        
+      
+      state = StateMgr.BindDecl(state, VD, InitVal);
+      
+      // The next thing to do is check if the GRTransferFuncs object wants to
+      // update the state based on the new binding.  If the GRTransferFunc
+      // object doesn't do anything, just auto-propagate the current state.
+      GRStmtNodeBuilderRef BuilderRef(Dst, *Builder, *this, *I, state, DS,true);
+      getTF().EvalBind(BuilderRef, loc::MemRegionVal(StateMgr.getRegion(VD)),
+                       InitVal);      
+    } 
+    else {
+      state = StateMgr.BindDeclWithNoInit(state, VD);
+      MakeNode(Dst, DS, *I, state);
+    }
   }
 }