diff options
author | Anna Zaks <ganna@apple.com> | 2011-10-18 23:06:48 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-10-18 23:06:48 +0000 |
commit | c9003c89c7aead1686aba89c8e3ddcea1f2bec54 (patch) | |
tree | 33ec4a356a4a66b44d723ff181a970d3de5b2556 | |
parent | 4e82d3cf6fd4c907265e3fa3aac0a835c35dc759 (diff) |
[analyzer] Move predecessor into the NodeBuilder context.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142454 91177308-0d34-0410-b5e6-96231b3b80d8
4 files changed, 25 insertions, 28 deletions
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h index c2188454c9..55ba42c737 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -48,7 +48,7 @@ public: Location(loc), ST(st), size(Dst.size()), - Ctx(builder.C.Eng, builder.getBlock()), + Ctx(builder.C.Eng, builder.getBlock(), pred), NB(builder), respondsToCallback(respondsToCB) { assert(!(ST && ST != Pred->getState())); diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h index 4892293a42..b151dfef22 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h @@ -171,8 +171,9 @@ public: struct NodeBuilderContext { CoreEngine &Eng; const CFGBlock *Block; - NodeBuilderContext(CoreEngine &E, const CFGBlock *B) - : Eng(E), Block(B) { assert(B); } + ExplodedNode *ContextPred; + NodeBuilderContext(CoreEngine &E, const CFGBlock *B, ExplodedNode *N) + : Eng(E), Block(B), ContextPred(N) { assert(B); assert(!N->isSink()); } }; /// This is the simplest builder which generates nodes in the ExplodedGraph. @@ -219,17 +220,15 @@ protected: bool MarkAsSink = false); public: - NodeBuilder(ExplodedNode *N, NodeBuilderContext &Ctx, bool F = true) - : BuilderPred(N), C(Ctx), Finalized(F), HasGeneratedNodes(false) { - assert(!N->isSink()); - Deferred.insert(N); + NodeBuilder(NodeBuilderContext &Ctx, bool F = true) + : C(Ctx), Finalized(F), HasGeneratedNodes(false) { + Deferred.insert(C.ContextPred); } /// Create a new builder using the parent builder's context. - NodeBuilder(ExplodedNode *N, const NodeBuilder &ParentBldr, bool F = true) - : BuilderPred(N), C(ParentBldr.C), Finalized(F), HasGeneratedNodes(false) { - assert(!N->isSink()); - Deferred.insert(N); + NodeBuilder(const NodeBuilder &ParentBldr, bool F = true) + : C(ParentBldr.C), Finalized(F), HasGeneratedNodes(false) { + Deferred.insert(C.ContextPred); } virtual ~NodeBuilder() {} @@ -269,8 +268,8 @@ public: /// visited on the exploded graph path. unsigned getCurrentBlockCount() const { return getBlockCounter().getNumVisited( - BuilderPred->getLocationContext()->getCurrentStackFrame(), - C.Block->getBlockID()); + C.ContextPred->getLocationContext()->getCurrentStackFrame(), + C.Block->getBlockID()); } }; @@ -363,7 +362,7 @@ public: } void importNodesFromBuilder(const NodeBuilder &NB) { - ExplodedNode *NBPred = const_cast<ExplodedNode*>(NB.BuilderPred); + ExplodedNode *NBPred = const_cast<ExplodedNode*>(NB.C.ContextPred); if (NB.hasGeneratedNodes()) { Deferred.erase(NBPred); Deferred.insert(NB.Deferred.begin(), NB.Deferred.end()); @@ -379,19 +378,19 @@ class BranchNodeBuilder: public NodeBuilder { bool InFeasibleFalse; public: - BranchNodeBuilder(ExplodedNode *Pred, NodeBuilderContext &C, + BranchNodeBuilder(NodeBuilderContext &C, const CFGBlock *dstT, const CFGBlock *dstF) - : NodeBuilder(Pred, C), DstT(dstT), DstF(dstF), + : NodeBuilder(C), DstT(dstT), DstF(dstF), InFeasibleTrue(!DstT), InFeasibleFalse(!DstF) {} /// Create a new builder using the parent builder's context. - BranchNodeBuilder(ExplodedNode *Pred, BranchNodeBuilder &ParentBldr) - : NodeBuilder(Pred, ParentBldr), DstT(ParentBldr.DstT), + BranchNodeBuilder(BranchNodeBuilder &ParentBldr) + : NodeBuilder(ParentBldr), DstT(ParentBldr.DstT), DstF(ParentBldr.DstF), InFeasibleTrue(!DstT), InFeasibleFalse(!DstF) {} ExplodedNode *generateNode(const ProgramState *State, bool branch, - ExplodedNode *Pred = 0); + ExplodedNode *Pred); const CFGBlock *getTargetBlock(bool branch) const { return branch ? DstT : DstF; diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index a40a0dc683..93eb1423cf 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -314,7 +314,7 @@ void CoreEngine::HandleBlockEntrance(const BlockEntrance &L, // Process the entrance of the block. if (CFGElement E = L.getFirstElement()) { - NodeBuilderContext Ctx(*this, L.getBlock()); + NodeBuilderContext Ctx(*this, L.getBlock(), Pred); StmtNodeBuilder Builder(Pred, 0, Ctx); SubEng.processCFGElement(E, Builder, Pred); } @@ -418,7 +418,7 @@ void CoreEngine::HandleBlockExit(const CFGBlock * B, ExplodedNode *Pred) { void CoreEngine::HandleBranch(const Stmt *Cond, const Stmt *Term, const CFGBlock * B, ExplodedNode *Pred) { assert(B->succ_size() == 2); - NodeBuilderContext Ctx(*this, B); + NodeBuilderContext Ctx(*this, B, Pred); SubEng.processBranch(Cond, Term, Ctx, Pred, *(B->succ_begin()), *(B->succ_begin()+1)); } @@ -431,7 +431,7 @@ void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx, if (StmtIdx == B->size()) HandleBlockExit(B, Pred); else { - NodeBuilderContext Ctx(*this, B); + NodeBuilderContext Ctx(*this, B, Pred); StmtNodeBuilder Builder(Pred, StmtIdx, Ctx); SubEng.processCFGElement((*B)[StmtIdx], Builder, Pred); } @@ -508,7 +508,7 @@ ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc, StmtNodeBuilder::StmtNodeBuilder(ExplodedNode *N, unsigned idx, NodeBuilderContext &Ctx) - : NodeBuilder(N, Ctx), Idx(idx), + : NodeBuilder(Ctx), Idx(idx), PurgingDeadSymbols(false), BuildSinks(false), hasGeneratedNode(false), PointKind(ProgramPoint::PostStmtKind), Tag(0) { Deferred.insert(N); @@ -573,8 +573,6 @@ ExplodedNode *BranchNodeBuilder::generateNode(const ProgramState *State, if (!isFeasible(branch)) return NULL; - if (!NodePred) - NodePred = BuilderPred; ProgramPoint Loc = BlockEdge(C.Block, branch ? DstT:DstF, NodePred->getLocationContext()); ExplodedNode *Succ = generateNodeImpl(Loc, State, NodePred); diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 19b1a2fa73..5f1fe1b5e0 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -949,7 +949,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, // Check for NULL conditions; e.g. "for(;;)" if (!Condition) { - BranchNodeBuilder NullCondBldr(Pred, BldCtx, DstT, DstF); + BranchNodeBuilder NullCondBldr(BldCtx, DstT, DstF); NullCondBldr.markInfeasible(false); NullCondBldr.generateNode(Pred->getState(), true, Pred); Engine.enqueue(NullCondBldr); @@ -960,7 +960,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, Condition->getLocStart(), "Error evaluating branch"); - NodeBuilder CheckerBldr(Pred, BldCtx); + NodeBuilder CheckerBldr(BldCtx); getCheckerManager().runCheckersForBranchCondition(Condition, CheckerBldr, Pred, *this); @@ -971,7 +971,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, if (PredI->isSink()) continue; - BranchNodeBuilder builder(PredI, BldCtx, DstT, DstF); + BranchNodeBuilder builder(BldCtx, DstT, DstF); const ProgramState *PrevState = Pred->getState(); SVal X = PrevState->getSVal(Condition); |