diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-21 00:27:44 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-21 00:27:44 +0000 |
commit | 5917d7894e8274b9625275dd4dd86c5d0040a242 (patch) | |
tree | 09c3178478323c166af19f8a16b96037f5dc42d4 /lib/Analysis/GRExprEngine.cpp | |
parent | 9f49055456049bdff41f61231553d29573fac184 (diff) |
- Clean up transfer function logic for 'return' statements.
- Add check for returning an undefined value to a caller.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59764 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index fe7d6f9426..db325fb9f9 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -2246,47 +2246,37 @@ void GRExprEngine::VisitReturnStmt(ReturnStmt* S, NodeTy* Pred, NodeSet& Dst) { return; } - NodeSet DstRet; - QualType T = R->getType(); - - if (T->isPointerLikeType()) { - - // Check if any of the return values return the address of a stack variable. - - NodeSet Tmp; - Visit(R, Pred, Tmp); - - for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) { - SVal X = GetSVal((*I)->getState(), R); - - if (isa<loc::MemRegionVal>(X)) { - - // Determine if the value is on the stack. - const MemRegion* R = cast<loc::MemRegionVal>(&X)->getRegion(); + NodeSet Tmp; + Visit(R, Pred, Tmp); - if (R && getStateManager().hasStackStorage(R)) { - - // Create a special node representing the v - - NodeTy* RetStackNode = Builder->generateNode(S, GetState(*I), *I); - - if (RetStackNode) { - RetStackNode->markAsSink(); - RetsStackAddr.insert(RetStackNode); - } - - continue; + for (NodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I != E; ++I) { + SVal X = GetSVal((*I)->getState(), R); + + // Check if we return the address of a stack variable. + if (isa<loc::MemRegionVal>(X)) { + // Determine if the value is on the stack. + const MemRegion* R = cast<loc::MemRegionVal>(&X)->getRegion(); + + if (R && getStateManager().hasStackStorage(R)) { + // Create a special node representing the error. + if (NodeTy* N = Builder->generateNode(S, GetState(*I), *I)) { + N->markAsSink(); + RetsStackAddr.insert(N); } + continue; } - - DstRet.Add(*I); } - } - else - Visit(R, Pred, DstRet); - - for (NodeSet::iterator I=DstRet.begin(), E=DstRet.end(); I!=E; ++I) + // Check if we return an undefined value. + else if (X.isUndef()) { + if (NodeTy* N = Builder->generateNode(S, GetState(*I), *I)) { + N->markAsSink(); + RetsUndef.insert(N); + } + continue; + } + EvalReturn(Dst, S, *I); + } } //===----------------------------------------------------------------------===// |