Fixed #2798 (False positive: Invalid iterator check doesn't respect code paths)

This commit is contained in:
Daniel Marjamäki 2011-05-22 17:17:24 +02:00
parent 4cc13f497d
commit 1c841535ee
2 changed files with 17 additions and 1 deletions

View File

@ -652,7 +652,8 @@ void CheckStl::pushback()
tok2 = tok2->tokAt(3)->link(); tok2 = tok2->tokAt(3)->link();
} }
else if (tok2->str() == "return" || tok2->str() == "break") // TODO: instead of bail out for 'else' try to check all execution paths.
else if (tok2->str() == "return" || tok2->str() == "break" || tok2->str() == "else")
{ {
invalidIterator.clear(); invalidIterator.clear();
} }

View File

@ -75,6 +75,7 @@ private:
TEST_CASE(pushback8); TEST_CASE(pushback8);
TEST_CASE(pushback9); TEST_CASE(pushback9);
TEST_CASE(pushback10); TEST_CASE(pushback10);
TEST_CASE(pushback11);
TEST_CASE(insert1); TEST_CASE(insert1);
TEST_CASE(insert2); TEST_CASE(insert2);
@ -890,6 +891,20 @@ private:
ASSERT_EQUALS("[test.cpp:8]: (error) After reserve, the iterator 'it' may be invalid\n", errout.str()); ASSERT_EQUALS("[test.cpp:8]: (error) After reserve, the iterator 'it' may be invalid\n", errout.str());
} }
void pushback11()
{
// #2798
check("void f() {\n"
" std::vector<int> ints;\n"
" std::vector<int>::iterator it = ints.begin();\n"
" if (it == ints.begin()) {\n"
" ints.push_back(0);\n"
" } else {\n"
" ints.insert(it,0);\n"
" }\n"
"}");
ASSERT_EQUALS("", errout.str());
}
void insert1() void insert1()
{ {