diff options
-rw-r--r-- | include/clang/Checker/PathSensitive/GRCoreEngine.h | 6 | ||||
-rw-r--r-- | lib/Checker/CallInliner.cpp | 14 | ||||
-rw-r--r-- | lib/Checker/GRCoreEngine.cpp | 4 | ||||
-rw-r--r-- | lib/Checker/GRExprEngine.cpp | 16 |
4 files changed, 24 insertions, 16 deletions
diff --git a/include/clang/Checker/PathSensitive/GRCoreEngine.h b/include/clang/Checker/PathSensitive/GRCoreEngine.h index 40ff93bb5b..dd789cb735 100644 --- a/include/clang/Checker/PathSensitive/GRCoreEngine.h +++ b/include/clang/Checker/PathSensitive/GRCoreEngine.h @@ -502,7 +502,11 @@ public: GRCallExitNodeBuilder(GRCoreEngine &eng, const ExplodedNode *pred) : Eng(eng), Pred(pred) {} - void GenerateNode(); + const ExplodedNode *getPredecessor() const { return Pred; } + + const GRState *getState() const { return Pred->getState(); } + + void GenerateNode(const GRState *state); }; } // end clang namespace diff --git a/lib/Checker/CallInliner.cpp b/lib/Checker/CallInliner.cpp index e3c5e6036a..150102c5ef 100644 --- a/lib/Checker/CallInliner.cpp +++ b/lib/Checker/CallInliner.cpp @@ -60,20 +60,10 @@ void CallInliner::EvalEndPath(GREndPathNodeBuilder &B, void *tag, ExplodedNode *Pred = B.getPredecessor(); const StackFrameContext *LocCtx = - cast<StackFrameContext>(Pred->getLocationContext()); + cast<StackFrameContext>(Pred->getLocationContext()); // Check if this is the top level stack frame. if (!LocCtx->getParent()) - return; - - const StackFrameContext *ParentSF = - cast<StackFrameContext>(LocCtx->getParent()); - - SymbolReaper SymReaper(*ParentSF->getLiveVariables(), Eng.getSymbolManager(), - ParentSF); - const Stmt *CE = LocCtx->getCallSite(); - // FIXME: move this logic to GRExprEngine::ProcessCallExit(). - state = Eng.getStateManager().RemoveDeadBindings(state, const_cast<Stmt*>(CE), - SymReaper); + return; B.GenerateCallExitNode(state); } diff --git a/lib/Checker/GRCoreEngine.cpp b/lib/Checker/GRCoreEngine.cpp index 17ef1d48f5..cbc1cf2621 100644 --- a/lib/Checker/GRCoreEngine.cpp +++ b/lib/Checker/GRCoreEngine.cpp @@ -674,14 +674,14 @@ void GRCallEnterNodeBuilder::GenerateNode(const GRState *state, Eng.WList->Enqueue(Node); } -void GRCallExitNodeBuilder::GenerateNode() { +void GRCallExitNodeBuilder::GenerateNode(const GRState *state) { // Get the callee's location context. const StackFrameContext *LocCtx = cast<StackFrameContext>(Pred->getLocationContext()); PostStmt Loc(LocCtx->getCallSite(), LocCtx->getParent()); bool isNew; - ExplodedNode *Node = Eng.G->getNode(Loc, Pred->getState(), &isNew); + ExplodedNode *Node = Eng.G->getNode(Loc, state, &isNew); Node->addPredecessor(const_cast<ExplodedNode*>(Pred), *Eng.G); if (isNew) Eng.WList->Enqueue(Node, *const_cast<CFGBlock*>(LocCtx->getCallSiteBlock()), diff --git a/lib/Checker/GRExprEngine.cpp b/lib/Checker/GRExprEngine.cpp index 695ed02e22..30b82f70ce 100644 --- a/lib/Checker/GRExprEngine.cpp +++ b/lib/Checker/GRExprEngine.cpp @@ -1305,7 +1305,21 @@ void GRExprEngine::ProcessCallEnter(GRCallEnterNodeBuilder &B) { } void GRExprEngine::ProcessCallExit(GRCallExitNodeBuilder &B) { - B.GenerateNode(); + const GRState *state = B.getState(); + const ExplodedNode *Pred = B.getPredecessor(); + const StackFrameContext *LocCtx = + cast<StackFrameContext>(Pred->getLocationContext()); + const StackFrameContext *ParentSF = + cast<StackFrameContext>(LocCtx->getParent()); + + SymbolReaper SymReaper(*ParentSF->getLiveVariables(), getSymbolManager(), + ParentSF); + const Stmt *CE = LocCtx->getCallSite(); + + state = getStateManager().RemoveDeadBindings(state, const_cast<Stmt*>(CE), + SymReaper); + + B.GenerateNode(state); } //===----------------------------------------------------------------------===// |