From a4a225203cb9fcd7ed6d2d821fcf3370a23cd70d Mon Sep 17 00:00:00 2001 From: abhijit-sawant Date: Mon, 4 Jan 2021 04:07:07 -0500 Subject: [PATCH] Fix #9938 (false positive: StlMissingComparison) (#2989) --- lib/checkstl.cpp | 44 +++++++++++++++++++++++++++++++------------- test/teststl.cpp | 8 ++++++++ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index efd15cf45..95df25af1 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1637,23 +1637,41 @@ void CheckStl::missingComparison() } const Token *incrementToken = nullptr; + bool bComparedInAdvance = false; // Parse loop.. - for (const Token *tok3 = scope.bodyStart; tok3 != scope.bodyEnd; tok3 = tok3->next()) { - if (Token::Match(tok3, "%varid% ++", iteratorId)) - incrementToken = tok3; - else if (Token::Match(tok3->previous(), "++ %varid% !!.", iteratorId)) - incrementToken = tok3; - else if (Token::Match(tok3, "%varid% !=|==", iteratorId)) - incrementToken = nullptr; + for (const Token *tok3 = scope.bodyStart; tok3 != scope.bodyEnd; tok3 = tok3->next()) + { + if (tok3->varId() == iteratorId) + { + if (Token::Match(tok3, "%varid% = %name% . insert ( ++| %varid% ++| ,", iteratorId)) + { + // skip insertion.. + tok3 = tok3->linkAt(6); + if (!tok3) + break; + } + else if (Token::simpleMatch(tok3->astParent(), "++")) + { + if (!bComparedInAdvance) + incrementToken = tok3; + else + bComparedInAdvance = false; + } + else if (Token::simpleMatch(tok3->astParent(), "+")) + { + if (Token::simpleMatch(tok3->astSibling(), "1")) + { + const Token* tokenGrandParent = tok3->astParent()->astParent(); + if (Token::Match(tokenGrandParent, "==|!=")) + bComparedInAdvance = true; + } + } + else if (Token::Match(tok3->astParent(), "==|!=")) + incrementToken = nullptr; + } else if (tok3->str() == "break" || tok3->str() == "return") incrementToken = nullptr; - else if (Token::Match(tok3, "%varid% = %name% . insert ( ++| %varid% ++| ,", iteratorId)) { - // skip insertion.. - tok3 = tok3->linkAt(6); - if (!tok3) - break; - } } if (incrementToken) missingComparisonError(incrementToken, tok2->tokAt(16)); diff --git a/test/teststl.cpp b/test/teststl.cpp index 7db9d5c4f..190cb5c3b 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -2986,6 +2986,14 @@ private: " }\n" "}"); ASSERT_EQUALS("", errout.str()); + + check("void f(const std::vector &v) {\n" + " for(std::vector::const_iterator it = v.begin(); it != v.end(); ++it) {\n" + " if(it+1 != v.end())\n" + " ++it;\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void missingInnerComparison2() {