void CheckerVisit(Stmt *S, ExplodedNodeSet &Dst, ExplodedNodeSet &Src,
bool isPrevisit);
- ExplodedNode *CheckerVisitLocation(Stmt *S, ExplodedNode *Pred,
- const GRState *state, SVal V);
-
/// Visit - Transfer function logic for all statements. Dispatches to
/// other functions that handle specific kinds of statements.
void Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst);
// automatically.
}
-ExplodedNode *GRExprEngine::CheckerVisitLocation(Stmt *S, ExplodedNode *Pred,
- const GRState *state, SVal V) {
- if (Checkers.empty())
- return Pred;
-
- for (CheckersOrdered::iterator I = Checkers.begin(),
- E = Checkers.end(); I != E; ++I) {
- Pred = I->second->CheckLocation(S, Pred, state, V, *this);
- if (!Pred)
- break;
- }
-
- return Pred;
-}
-
//===----------------------------------------------------------------------===//
// Engine construction and deletion.
//===----------------------------------------------------------------------===//
SaveAndRestore<const void*> OldTag(Builder->Tag);
Builder->Tag = tag;
- if (location.isUnknown())
+ if (location.isUnknown() || Checkers.empty())
return Pred;
- return CheckerVisitLocation(Ex, Pred, state, location);
-
+
+ for (CheckersOrdered::iterator I=Checkers.begin(), E=Checkers.end(); I!=E;++I)
+ {
+ Pred = I->second->CheckLocation(Ex, Pred, state, location, *this);
+ if (!Pred)
+ break;
+ }
+
+ return Pred;
// FIXME: Temporarily disable out-of-bounds checking until we make
// the logic reflect recent changes to CastRegion and friends.