From 7750f327ff523323a50de6a8745469f61d7763f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 13 Apr 2009 17:48:13 +0200 Subject: [PATCH] STL boundries: added new check written by Bill Eggert (#247) --- src/checkstl.cpp | 32 ++++++++++++++++++++++++++++++++ src/checkstl.h | 8 ++++++++ test/teststl.cpp | 15 +++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/checkstl.cpp b/src/checkstl.cpp index a3946a82b..4fe4d641e 100644 --- a/src/checkstl.cpp +++ b/src/checkstl.cpp @@ -281,3 +281,35 @@ void CheckStl::pushbackError(const Token *tok, const std::string &iterator_name) } + + +void CheckStl::stlBoundries() +{ + for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) + { + if (Token::Match(tok, "for (")) + { + for (const Token *tok2 = tok->tokAt(2); tok2 && tok2->str() != ";"; tok2 = tok2->next()) + { + if (Token::Match(tok2, "%var% = %var% . begin ( ) ; %var% < %var% . end ( ) ") && + tok2->str() == tok2->tokAt(8)->str() && + tok2->tokAt(2)->str() == tok2->tokAt(10)->str()) + { + stlBoundriesError(tok2); + break; + } + } + } + + if (Token::Match(tok, "while ( %var% < %var% . end ( )")) + { + stlBoundriesError(tok); + } + } +} + +// Error message for bad boundry usage.. +void CheckStl::stlBoundriesError(const Token *tok) +{ + reportError(tok, "error", "stlBoundries", "STL range check should be using != and not < since the order of the pointers isn't guaranteed"); +} diff --git a/src/checkstl.h b/src/checkstl.h index 59698b82e..60222fbaf 100644 --- a/src/checkstl.h +++ b/src/checkstl.h @@ -47,6 +47,7 @@ public: checkStl.iterators(); checkStl.erase(); checkStl.pushback(); + checkStl.stlBoundries(); } @@ -72,6 +73,11 @@ public: */ void pushback(); + /** + * bad condition.. "it < alist.end()" + */ + void stlBoundries(); + private: /** @@ -85,6 +91,7 @@ private: void iteratorsError(const Token *tok, const std::string &container1, const std::string &container2); void eraseError(const Token *tok); void pushbackError(const Token *tok, const std::string &iterator_name); + void stlBoundriesError(const Token *tok); void getErrorMessages() { @@ -92,6 +99,7 @@ private: stlOutOfBoundsError(0, "i", "foo"); eraseError(0); pushbackError(0, "iterator"); + stlBoundriesError(0); } }; diff --git a/test/teststl.cpp b/test/teststl.cpp index 139fa3851..1b2baca80 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -47,6 +47,8 @@ private: TEST_CASE(pushback1); TEST_CASE(invalidcode); + + TEST_CASE(stlBoundries1); } void check(const char code[]) @@ -252,6 +254,19 @@ private: "}\n"); ASSERT_EQUALS("", errout.str()); } + + + + void stlBoundries1() + { + check("void f()\n" + "{\n" + " for (it = ab.begin(); it < ab.end(); ++it)\n" + " ;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3]: (error) STL range check should be using != and not < since the order of the pointers isn't guaranteed\n", errout.str()); + } + }; REGISTER_TEST(TestStl)