From c9fb5f87e0d6756e1cda1e8836b7f47157b5a6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 16 Apr 2010 16:56:55 +0200 Subject: [PATCH] Fixed #1600 (false positive: After insert, the iterator 'aI' may be invalid) --- lib/checkstl.cpp | 5 +++++ test/teststl.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index ed9823f75..8f7bf09ff 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -432,6 +432,11 @@ void CheckStl::pushback() } } + else if (tok2->str() == "return") + { + invalidIterator.clear(); + } + // Using invalid iterator.. if (!invalidIterator.empty()) { diff --git a/test/teststl.cpp b/test/teststl.cpp index bb9d64530..ece91cfa9 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -40,6 +40,7 @@ private: TEST_CASE(iterator4); TEST_CASE(iterator5); TEST_CASE(iterator6); + TEST_CASE(iterator7); TEST_CASE(dereference); TEST_CASE(dereference_member); @@ -176,6 +177,45 @@ private: ASSERT_EQUALS("", errout.str()); } + void iterator7() + { + // Ticket #1600 + check("void foo(std::vector &r)\n" + "{\n" + " std::vector::iterator aI = r.begin();\n" + " while(aI != r.end())\n" + " {\n" + " if (*aI == 0)\n" + " {\n" + " r.insert(aI, 42);\n" + " return;\n" + " }\n" + " ++aI;\n" + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + // Execution path checking.. + check("void foo(std::vector &r, int c)\n" + "{\n" + " std::vector::iterator aI = r.begin();\n" + " while(aI != r.end())\n" + " {\n" + " if (*aI == 0)\n" + " {\n" + " r.insert(aI, 42);\n" + " if (c)\n" + " {\n" + " return;\n" + " }\n" + " }\n" + " ++aI;\n" + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:14] (error) After insert, the iterator 'aI' may be invalid", errout.str()); + } + // Dereferencing invalid pointer void dereference() {