diff options
author | Anna Zaks <ganna@apple.com> | 2011-10-24 18:25:53 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-10-24 18:25:53 +0000 |
commit | 1aae01a8308d2f8e31adab3f4d7ac35543aac680 (patch) | |
tree | 81807c40f9fd0a60caa539fe85407d69c6b6760f /lib/StaticAnalyzer/Core | |
parent | fe9b2a84105b898b48a2935d50d209c880f36aa3 (diff) |
[analyzer] Pass external Dst set to NodeBuilder
This moves the responsibility for storing the output node set from the
builder to the clients. The builder is just responsible for transforming
an input set into the output set: {SrcSet/SrcNode} -> {Frontier}.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142826 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core')
-rw-r--r-- | lib/StaticAnalyzer/Core/CheckerContext.cpp | 4 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/CoreEngine.cpp | 40 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngine.cpp | 19 |
3 files changed, 27 insertions, 36 deletions
diff --git a/lib/StaticAnalyzer/Core/CheckerContext.cpp b/lib/StaticAnalyzer/Core/CheckerContext.cpp index 26479d0552..5f43b77ceb 100644 --- a/lib/StaticAnalyzer/Core/CheckerContext.cpp +++ b/lib/StaticAnalyzer/Core/CheckerContext.cpp @@ -18,8 +18,8 @@ using namespace ento; CheckerContext::~CheckerContext() { // Copy the results into the Dst set. - for (NodeBuilder::iterator I = NB.results_begin(), - E = NB.results_end(); I != E; ++I) { + for (NodeBuilder::iterator I = NB.begin(), + E = NB.end(); I != E; ++I) { Dst.Add(*I); } } diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index 525bd71111..b9ab7b4c74 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -315,7 +315,8 @@ void CoreEngine::HandleBlockEntrance(const BlockEntrance &L, // Process the entrance of the block. if (CFGElement E = L.getFirstElement()) { NodeBuilderContext Ctx(*this, L.getBlock(), Pred); - StmtNodeBuilder Builder(Pred, 0, Ctx); + ExplodedNodeSet Dst; + StmtNodeBuilder Builder(Pred, Dst, 0, Ctx); SubEng.processCFGElement(E, Builder, Pred); } else @@ -419,8 +420,11 @@ void CoreEngine::HandleBranch(const Stmt *Cond, const Stmt *Term, const CFGBlock * B, ExplodedNode *Pred) { assert(B->succ_size() == 2); NodeBuilderContext Ctx(*this, B, Pred); - SubEng.processBranch(Cond, Term, Ctx, Pred, + ExplodedNodeSet Dst; + SubEng.processBranch(Cond, Term, Ctx, Pred, Dst, *(B->succ_begin()), *(B->succ_begin()+1)); + // Enqueue the new frontier onto the worklist. + enqueue(Dst); } void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx, @@ -432,7 +436,8 @@ void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx, HandleBlockExit(B, Pred); else { NodeBuilderContext Ctx(*this, B, Pred); - StmtNodeBuilder Builder(Pred, StmtIdx, Ctx); + ExplodedNodeSet Dst; + StmtNodeBuilder Builder(Pred, Dst, StmtIdx, Ctx); SubEng.processCFGElement((*B)[StmtIdx], Builder, Pred); } } @@ -457,9 +462,9 @@ void CoreEngine::generateNode(const ProgramPoint &Loc, if (IsNew) WList->enqueue(Node); } -void CoreEngine::enqueue(NodeBuilder &NB) { - for (NodeBuilder::iterator I = NB.results_begin(), - E = NB.results_end(); I != E; ++I) { +void CoreEngine::enqueue(ExplodedNodeSet &S) { + for (ExplodedNodeSet::iterator I = S.begin(), + E = S.end(); I != E; ++I) { WList->enqueue(*I); } } @@ -494,28 +499,19 @@ ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc, bool IsNew; ExplodedNode *N = C.Eng.G->getNode(Loc, State, &IsNew); N->addPredecessor(FromN, *C.Eng.G); - Deferred.erase(FromN); + Frontier.erase(FromN); if (MarkAsSink) N->markAsSink(); - - if (IsNew && !N->isSink()) - Deferred.insert(N); + + if (IsNew) + Frontier.Add(N); return (IsNew ? N : 0); } - -StmtNodeBuilder::StmtNodeBuilder(ExplodedNode *N, unsigned idx, - NodeBuilderContext &Ctx) - : NodeBuilder(Ctx), Idx(idx), - PurgingDeadSymbols(false), BuildSinks(false), hasGeneratedNode(false), - PointKind(ProgramPoint::PostStmtKind), Tag(0) { - Deferred.insert(N); -} - StmtNodeBuilder::~StmtNodeBuilder() { - for (DeferredTy::iterator I=Deferred.begin(), E=Deferred.end(); I!=E; ++I) + for (iterator I=Frontier.begin(), E=Frontier.end(); I!=E; ++I) if (!(*I)->isSink()) GenerateAutoTransition(*I); } @@ -554,14 +550,14 @@ void StmtNodeBuilder::GenerateAutoTransition(ExplodedNode *N) { C.Eng.WList->enqueue(Succ, C.Block, Idx+1); } -ExplodedNode *StmtNodeBuilder::MakeNode(ExplodedNodeSet &Dst, +ExplodedNode *StmtNodeBuilder::MakeNode(ExplodedNodeSet &DstSet, const Stmt *S, ExplodedNode *Pred, const ProgramState *St, ProgramPoint::Kind K) { ExplodedNode *N = generateNode(S, St, Pred, K, 0, BuildSinks); if (N && !BuildSinks){ - Dst.Add(N); + DstSet.Add(N); } return N; } diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 269d7c74ee..5742266de2 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -945,15 +945,14 @@ static SVal RecoverCastedSymbol(ProgramStateManager& StateMgr, void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, NodeBuilderContext& BldCtx, ExplodedNode *Pred, + ExplodedNodeSet &Dst, const CFGBlock *DstT, const CFGBlock *DstF) { - // Check for NULL conditions; e.g. "for(;;)" if (!Condition) { - BranchNodeBuilder NullCondBldr(BldCtx, DstT, DstF); + BranchNodeBuilder NullCondBldr(Pred, Dst, BldCtx, DstT, DstF); NullCondBldr.markInfeasible(false); NullCondBldr.generateNode(Pred->getState(), true, Pred); - Engine.enqueue(NullCondBldr); return; } @@ -961,18 +960,19 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, Condition->getLocStart(), "Error evaluating branch"); - NodeBuilder CheckerBldr(BldCtx); + ExplodedNodeSet TmpCheckersOut; + NodeBuilder CheckerBldr(Pred, TmpCheckersOut, BldCtx); getCheckerManager().runCheckersForBranchCondition(Condition, CheckerBldr, Pred, *this); - for (NodeBuilder::iterator I = CheckerBldr.results_begin(), - E = CheckerBldr.results_end(); E != I; ++I) { + BranchNodeBuilder builder(CheckerBldr.getResults(), Dst, BldCtx, DstT, DstF); + for (NodeBuilder::iterator I = CheckerBldr.begin(), + E = CheckerBldr.end(); E != I; ++I) { ExplodedNode *PredI = *I; if (PredI->isSink()) continue; - BranchNodeBuilder builder(BldCtx, DstT, DstF); const ProgramState *PrevState = Pred->getState(); SVal X = PrevState->getSVal(Condition); @@ -998,8 +998,6 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, if (X.isUnknownOrUndef()) { builder.generateNode(MarkBranch(PrevState, Term, true), true, PredI); builder.generateNode(MarkBranch(PrevState, Term, false), false, PredI); - // Enqueue the results into the work list. - Engine.enqueue(builder); continue; } @@ -1020,9 +1018,6 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term, else builder.markInfeasible(false); } - - // Enqueue the results into the work list. - Engine.enqueue(builder); } } |