Fixed #1844 (False positive: invalid iterator when erase() is used in if-else (with continue))

This commit is contained in:
Daniel Marjamäki 2010-07-14 09:42:10 +02:00
parent 73c6a154f3
commit a1ce80806e
2 changed files with 31 additions and 0 deletions

View File

@ -291,7 +291,20 @@ void CheckStl::eraseCheckLoop(const Token *it)
break;
}
else if (Token::simpleMatch(tok, ("erase ( " + it->str() + " )").c_str()))
{
tok2 = tok;
while (tok2 = tok2 ? tok2->previous() : 0)
{
if (Token::Match(tok2, "[;{}]"))
break;
else if (tok2->str() == "=")
tok2 = 0;
else
tok2 = tok2->previous();
}
if (tok2)
tok2 = tok;
}
}
// Write error message..

View File

@ -53,6 +53,7 @@ private:
TEST_CASE(erase3);
TEST_CASE(erase4);
TEST_CASE(eraseBreak);
TEST_CASE(eraseContinue);
TEST_CASE(eraseReturn1);
TEST_CASE(eraseReturn2);
TEST_CASE(eraseGoto);
@ -443,6 +444,23 @@ private:
ASSERT_EQUALS("", errout.str());
}
void eraseContinue()
{
check("void f(std::vector<int> &ints)\n"
"{\n"
" std::vector<int>::iterator it;\n"
" std::vector<int>::iterator jt = ints.begin();\n"
" for (it = ints.begin(); it != ints.end(); it = jt) {\n"
" ++jt;\n"
" if (*it == 1) {\n"
" jt = ints.erase(it);\n"
" continue;\n"
" }\n"
" }\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
void eraseReturn1()
{
check("void f()\n"