From f923a9117a0ec4a529a257f0e53a657323ebfe4a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 12 Mar 2008 21:04:07 +0000 Subject: [PATCH] In GRSimpleVals, added the generation of symbolic values for the return values 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 | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Analysis/GRSimpleVals.cpp b/Analysis/GRSimpleVals.cpp index 75ca27e1b4..b4abc3afdd 100644 --- a/Analysis/GRSimpleVals.cpp +++ b/Analysis/GRSimpleVals.cpp @@ -414,18 +414,32 @@ void GRSimpleVals::EvalCall(ExplodedNodeSet& Dst, CallExpr* CE, LVal L, ExplodedNode* 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(V)) - St = Eng.getStateManager().SetRVal(St, cast(V), UnknownVal()); + St = StateMgr.SetRVal(St, cast(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(lval::SymbolVal(Sym)) + : cast(nonlval::SymbolVal(Sym)); + + St = StateMgr.SetRVal(St, CE, X, Eng.getCFG().isBlkExpr(CE), false); + } Builder.Nodify(Dst, CE, Pred, St); } -- 2.40.0