diff options
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp index 143910588959..1960873599f7 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp @@ -28,7 +28,7 @@ using namespace iterator; namespace { class MismatchedIteratorChecker - : public Checker<check::PreCall> { + : public Checker<check::PreCall, check::PreStmt<BinaryOperator>> { std::unique_ptr<BugType> MismatchedBugType; @@ -47,6 +47,7 @@ public: MismatchedIteratorChecker(); void checkPreCall(const CallEvent &Call, CheckerContext &C) const; + void checkPreStmt(const BinaryOperator *BO, CheckerContext &C) const; }; @@ -141,7 +142,7 @@ void MismatchedIteratorChecker::checkPreCall(const CallEvent &Call, // Example: // template<typename I1, typename I2> // void f(I1 first1, I1 last1, I2 first2, I2 last2); - // + // // In this case the first two arguments to f() must be iterators must belong // to the same container and the last to also to the same container but // not necessarily to the same as the first two. @@ -188,6 +189,17 @@ void MismatchedIteratorChecker::checkPreCall(const CallEvent &Call, } } +void MismatchedIteratorChecker::checkPreStmt(const BinaryOperator *BO, + CheckerContext &C) const { + if (!BO->isComparisonOp()) + return; + + ProgramStateRef State = C.getState(); + SVal LVal = State->getSVal(BO->getLHS(), C.getLocationContext()); + SVal RVal = State->getSVal(BO->getRHS(), C.getLocationContext()); + verifyMatch(C, LVal, RVal); +} + void MismatchedIteratorChecker::verifyMatch(CheckerContext &C, const SVal &Iter, const MemRegion *Cont) const { // Verify match between a container and the container of an iterator @@ -290,6 +302,6 @@ void ento::registerMismatchedIteratorChecker(CheckerManager &mgr) { mgr.registerChecker<MismatchedIteratorChecker>(); } -bool ento::shouldRegisterMismatchedIteratorChecker(const LangOptions &LO) { +bool ento::shouldRegisterMismatchedIteratorChecker(const CheckerManager &mgr) { return true; } |