diff --git a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h index 57a826fba071..276819549d1a 100644 --- a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -177,7 +177,6 @@ public: const ExplodedNodeSet &Src, SVal location, bool isLoad, const Stmt *S, - const GRState *state, ExprEngine &Eng); /// \brief Run checkers for end of analysis. diff --git a/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp index 7d020dacae44..c1b1e656989b 100644 --- a/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp @@ -1955,14 +1955,21 @@ void ExprEngine::evalLocation(ExplodedNodeSet &Dst, const Stmt *S, return; } - ExplodedNodeSet Src; - Src.Add(Pred); if (Checkers.empty()) { + ExplodedNodeSet Src; + if (Builder->GetState(Pred) == state) { + Src.Add(Pred); + } else { + // Associate this new state with an ExplodedNode. + Src.Add(Builder->generateNode(S, state, Pred)); + } getCheckerManager().runCheckersForLocation(Dst, Src, location, isLoad, S, - state, *this); + *this); return; } + ExplodedNodeSet Src; + Src.Add(Pred); ExplodedNodeSet CheckersV1Dst; ExplodedNodeSet Tmp; ExplodedNodeSet *PrevSet = &Src; @@ -1994,7 +2001,7 @@ void ExprEngine::evalLocation(ExplodedNodeSet &Dst, const Stmt *S, } getCheckerManager().runCheckersForLocation(Dst, CheckersV1Dst, location, - isLoad, S, state, *this); + isLoad, S, *this); } bool ExprEngine::InlineCall(ExplodedNodeSet &Dst, const CallExpr *CE, diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp index 68fac6e27761..75d331a131a8 100644 --- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -177,23 +177,20 @@ namespace { SVal Loc; bool IsLoad; const Stmt *S; - const GRState *State; ExprEngine &Eng; CheckersTy::const_iterator checkers_begin() { return Checkers.begin(); } CheckersTy::const_iterator checkers_end() { return Checkers.end(); } CheckLocationContext(const CheckersTy &checkers, - SVal loc, bool isLoad, const Stmt *s, - const GRState *state, ExprEngine &eng) - : Checkers(checkers), Loc(loc), IsLoad(isLoad), S(s), - State(state), Eng(eng) { } + SVal loc, bool isLoad, const Stmt *s, ExprEngine &eng) + : Checkers(checkers), Loc(loc), IsLoad(isLoad), S(s), Eng(eng) { } void runChecker(CheckerManager::CheckLocationFunc checkFn, ExplodedNodeSet &Dst, ExplodedNode *Pred) { CheckerContext C(Dst, Eng.getBuilder(), Eng, Pred, checkFn.Checker, IsLoad ? ProgramPoint::PreLoadKind : - ProgramPoint::PreStoreKind, 0, S, State); + ProgramPoint::PreStoreKind, 0, S); checkFn(Loc, IsLoad, C); } }; @@ -203,10 +200,8 @@ namespace { void CheckerManager::runCheckersForLocation(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, SVal location, bool isLoad, - const Stmt *S, - const GRState *state, - ExprEngine &Eng) { - CheckLocationContext C(LocationCheckers, location, isLoad, S, state, Eng); + const Stmt *S, ExprEngine &Eng) { + CheckLocationContext C(LocationCheckers, location, isLoad, S, Eng); expandGraphWithCheckers(C, Dst, Src); }