]> granicus.if.org Git - clang/commitdiff
In GRSimpleVals, added the generation of symbolic values for the return values
authorTed Kremenek <kremenek@apple.com>
Wed, 12 Mar 2008 21:04:07 +0000 (21:04 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 12 Mar 2008 21:04:07 +0000 (21:04 +0000)
of function calls. This is useful in pruning paths.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48299 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRSimpleVals.cpp

index 75ca27e1b4b136bf7d44a84f27407426dfbdf202..b4abc3afddbbbb4834185c82f4e6d100e0f2b4be 100644 (file)
@@ -414,18 +414,32 @@ void GRSimpleVals::EvalCall(ExplodedNodeSet<ValueState>& Dst,
                             CallExpr* CE, LVal L,
                             ExplodedNode<ValueState>* Pred) {
   
-  ValueState* St = Pred->getState();
+  ValueStateManager& StateMgr = Eng.getStateManager();
+  ValueState* St = Builder.GetState(Pred);
   
   // Invalidate all arguments passed in by reference (LVals).
 
   for (CallExpr::arg_iterator I = CE->arg_begin(), E = CE->arg_end();
         I != E; ++I) {
 
-    RVal V = Eng.getStateManager().GetRVal(St, *I);
+    RVal V = StateMgr.GetRVal(St, *I);
     
     if (isa<LVal>(V))
-      St = Eng.getStateManager().SetRVal(St, cast<LVal>(V), UnknownVal());
+      St = StateMgr.SetRVal(St, cast<LVal>(V), UnknownVal());
   }
+  
+  // Make up a symbol for the return value of this function.
+  
+  if (CE->getType() != Eng.getContext().VoidTy) {    
+    unsigned Count = Builder.getCurrentBlockCount();
+    SymbolID Sym = Eng.getSymbolManager().getCallRetValSymbol(CE, Count);
+        
+    RVal X = CE->getType()->isPointerType() 
+             ? cast<RVal>(lval::SymbolVal(Sym)) 
+             : cast<RVal>(nonlval::SymbolVal(Sym));
+    
+    St = StateMgr.SetRVal(St, CE, X, Eng.getCFG().isBlkExpr(CE), false);
+  }  
     
   Builder.Nodify(Dst, CE, Pred, St);
 }