diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-10-30 17:47:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-10-30 17:47:32 +0000 |
commit | 094bef56a7900f13bb777f9a352704104b1458e7 (patch) | |
tree | 24214582b6d11f2e572bb37dca5254c85d9b3591 | |
parent | d86caaa6c3d1f8ec4307f883d6b1a7722aecdc81 (diff) |
Make checkers run in deterministic order.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85597 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRExprEngine.h | 19 | ||||
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 24 |
2 files changed, 29 insertions, 14 deletions
diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index 89ca337f15..90124c279d 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -76,7 +76,11 @@ class GRExprEngine : public GRSubEngine { llvm::OwningPtr<GRSimpleAPICheck> BatchAuditor; - llvm::DenseMap<void *, Checker*> Checkers; + typedef llvm::DenseMap<void *, unsigned> CheckerMap; + CheckerMap CheckerM; + + typedef std::vector<std::pair<void *, Checker*> >CheckersOrdered; + CheckersOrdered Checkers; /// BR - The BugReporter associated with this engine. It is important that // this object be placed at the very end of member variables so that its @@ -205,13 +209,18 @@ public: void RegisterInternalChecks(); template <typename CHECKER> - void registerCheck(Checker *check) { - Checkers[CHECKER::getTag()] = check; + void registerCheck(CHECKER *check) { + unsigned entry = Checkers.size(); + void *tag = CHECKER::getTag(); + Checkers.push_back(std::make_pair(tag, check)); + CheckerM[tag] = entry; } + + Checker *lookupChecker(void *tag) const; template <typename CHECKER> - CHECKER *getChecker() { - return static_cast<CHECKER*>(Checkers[CHECKER::getTag()]); + CHECKER *getChecker() const { + return static_cast<CHECKER*>(lookupChecker(CHECKER::getTag())); } bool isRetStackAddr(const ExplodedNode* N) const { diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 88e67981ac..284fae8675 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -118,13 +118,11 @@ void GRExprEngine::CheckerVisit(Stmt *S, ExplodedNodeSet &Dst, ExplodedNodeSet Tmp; ExplodedNodeSet *PrevSet = &Src; - for (llvm::DenseMap<void*, Checker*>::iterator I = Checkers.begin(), - E = Checkers.end(); I != E; ++I) { - - llvm::DenseMap<void*, Checker*>::iterator X = I; - - ExplodedNodeSet *CurrSet = (++X == E) ? &Dst + for (CheckersOrdered::iterator I=Checkers.begin(),E=Checkers.end(); I!=E; ++I) + { + ExplodedNodeSet *CurrSet = (I+1 == E) ? &Dst : (PrevSet == &Tmp) ? &Src : &Tmp; + CurrSet->clear(); void *tag = I->first; Checker *checker = I->second; @@ -146,7 +144,7 @@ ExplodedNode *GRExprEngine::CheckerVisitLocation(Stmt *S, ExplodedNode *Pred, if (Checkers.empty()) return Pred; - for (llvm::DenseMap<void*, Checker*>::iterator I = Checkers.begin(), + for (CheckersOrdered::iterator I = Checkers.begin(), E = Checkers.end(); I != E; ++I) { Pred = I->second->CheckLocation(S, Pred, state, V, *this); if (!Pred) @@ -184,8 +182,7 @@ GRExprEngine::GRExprEngine(AnalysisManager &mgr) GRExprEngine::~GRExprEngine() { BR.FlushReports(); delete [] NSExceptionInstanceRaiseSelectors; - for (llvm::DenseMap<void*, Checker*>::iterator I=Checkers.begin(), - E=Checkers.end(); I!=E; ++I) + for (CheckersOrdered::iterator I=Checkers.begin(), E=Checkers.end(); I!=E;++I) delete I->second; } @@ -2861,6 +2858,15 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B, } //===----------------------------------------------------------------------===// +// Checker registration/lookup. +//===----------------------------------------------------------------------===// + +Checker *GRExprEngine::lookupChecker(void *tag) const { + CheckerMap::iterator I = CheckerM.find(tag); + return (I == CheckerM.end()) ? NULL : Checkers[I->second].second; +} + +//===----------------------------------------------------------------------===// // Visualization. //===----------------------------------------------------------------------===// |