diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-11-25 21:40:22 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-11-25 21:40:22 +0000 |
commit | b801b73fb94a818d750b814598892ec798b72724 (patch) | |
tree | 5557304aca5056c89d56123d9cd2585574885ab8 /lib/Analysis/GRExprEngine.cpp | |
parent | 67f44b178bf117a252594535468ed1f42ab434c1 (diff) |
When dispatching to Checker objects in GRExprEngine::CheckerVisit(),
only stop processing the checkers after all the nodes for a current
check have been processed. This (I believe) handles the case where
PredSet (the input nodes) contains more than one node due to state
bifurcation. Zhongxing: can you review this?
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89882 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 11ea5f8f3f..403126c471 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -118,6 +118,7 @@ bool GRExprEngine::CheckerVisit(Stmt *S, ExplodedNodeSet &Dst, ExplodedNodeSet Tmp; ExplodedNodeSet *PrevSet = &Src; + bool stopProcessingAfterCurrentChecker = false; for (CheckersOrdered::iterator I=Checkers.begin(),E=Checkers.end(); I!=E; ++I) { @@ -127,20 +128,27 @@ bool GRExprEngine::CheckerVisit(Stmt *S, ExplodedNodeSet &Dst, CurrSet->clear(); void *tag = I->first; Checker *checker = I->second; - + for (ExplodedNodeSet::iterator NI = PrevSet->begin(), NE = PrevSet->end(); NI != NE; ++NI) { // FIXME: Halting evaluation of the checkers is something we may - // not support later. The design is still evolving. + // not support later. The design is still evolving. if (checker->GR_Visit(*CurrSet, *Builder, *this, S, *NI, tag, isPrevisit)) { if (CurrSet != &Dst) Dst.insert(*CurrSet); - return true; + + stopProcessingAfterCurrentChecker = true; + continue; } + assert(stopProcessingAfterCurrentChecker == false && + "Inconsistent setting of 'stopProcessingAfterCurrentChecker'"); } + + if (stopProcessingAfterCurrentChecker) + return true; - // Update which NodeSet is the current one. + // Continue on to the next checker. Update the current NodeSet. PrevSet = CurrSet; } |