aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-03-12 21:04:07 +0000
committerTed Kremenek <kremenek@apple.com>2008-03-12 21:04:07 +0000
commitf923a9117a0ec4a529a257f0e53a657323ebfe4a (patch)
tree695d9fea8a5b28f39ae3ce617d34bdaec3846ba9
parente0e0c94fa26abeef39166fc0d50e901ba3a1a638 (diff)
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
-rw-r--r--Analysis/GRSimpleVals.cpp20
1 files 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<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);
}