Tweaker Checker::VisitEndAnalysis to have 'hasWorkRemaining' also

be true if some paths were aborted because they exceeded
the maximum loop unrolling count.

llvm-svn: 107209
This commit is contained in:
Ted Kremenek 2010-06-29 21:58:54 +00:00
parent c728518bfe
commit 090d62e7cc
2 changed files with 13 additions and 4 deletions

View File

@ -57,6 +57,10 @@ class GRCoreEngine {
/// These are used to record for key nodes in the ExplodedGraph the
/// number of times different CFGBlocks have been visited along a path.
GRBlockCounter::Factory BCounterFactory;
/// A flag that indicates whether paths were halted because
/// ProcessBlockEntrace returned false.
bool BlockAborted;
void GenerateNode(const ProgramPoint& Loc, const GRState* State,
ExplodedNode* Pred);
@ -108,14 +112,16 @@ public:
GRCoreEngine(ASTContext& ctx, GRSubEngine& subengine)
: SubEngine(subengine), G(new ExplodedGraph(ctx)),
WList(GRWorkList::MakeBFS()),
BCounterFactory(G->getAllocator()) {}
BCounterFactory(G->getAllocator()),
BlockAborted(false) {}
/// Construct a GRCoreEngine object to analyze the provided CFG and to
/// use the provided worklist object to execute the worklist algorithm.
/// The GRCoreEngine object assumes ownership of 'wlist'.
GRCoreEngine(ASTContext& ctx, GRWorkList* wlist, GRSubEngine& subengine)
: SubEngine(subengine), G(new ExplodedGraph(ctx)), WList(wlist),
BCounterFactory(G->getAllocator()) {}
BCounterFactory(G->getAllocator()),
BlockAborted(false) {}
~GRCoreEngine() {
delete WList;

View File

@ -221,7 +221,7 @@ bool GRCoreEngine::ExecuteWorkList(const LocationContext *L, unsigned Steps) {
}
}
SubEngine.ProcessEndWorklist(WList->hasWork());
SubEngine.ProcessEndWorklist(WList->hasWork() || BlockAborted);
return WList->hasWork();
}
@ -258,7 +258,10 @@ void GRCoreEngine::HandleBlockEdge(const BlockEdge& L, ExplodedNode* Pred) {
// FIXME: Should we allow ProcessBlockEntrance to also manipulate state?
if (ProcessBlockEntrance(Blk, Pred, WList->getBlockCounter()))
GenerateNode(BlockEntrance(Blk, Pred->getLocationContext()), Pred->State, Pred);
GenerateNode(BlockEntrance(Blk, Pred->getLocationContext()),
Pred->State, Pred);
else
BlockAborted = true;
}
void GRCoreEngine::HandleBlockEntrance(const BlockEntrance& L,