Fixed #1679 (Bad iterators checks fails to detect bugs with indent levels)
This commit is contained in:
parent
0510d9a2b0
commit
c0149d3cd1
|
@ -64,9 +64,12 @@ void CheckStl::iterators()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool validIterator = true;
|
bool validIterator = true;
|
||||||
|
unsigned int indent = 0;
|
||||||
for (const Token *tok2 = tok->tokAt(7); tok2; tok2 = tok2->next())
|
for (const Token *tok2 = tok->tokAt(7); tok2; tok2 = tok2->next())
|
||||||
{
|
{
|
||||||
if (tok2->str() == "}")
|
if (tok2->str() == "{" && ++indent)
|
||||||
|
continue;
|
||||||
|
if (tok2->str() == "}" && --indent == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (Token::Match(tok2, "%varid% != %var% . end ( )", iteratorId) && tok2->tokAt(2)->varId() != containerId)
|
if (Token::Match(tok2, "%varid% != %var% . end ( )", iteratorId) && tok2->tokAt(2)->varId() != containerId)
|
||||||
|
|
|
@ -41,6 +41,7 @@ private:
|
||||||
TEST_CASE(iterator5);
|
TEST_CASE(iterator5);
|
||||||
TEST_CASE(iterator6);
|
TEST_CASE(iterator6);
|
||||||
TEST_CASE(iterator7);
|
TEST_CASE(iterator7);
|
||||||
|
TEST_CASE(iterator8);
|
||||||
|
|
||||||
TEST_CASE(dereference);
|
TEST_CASE(dereference);
|
||||||
TEST_CASE(dereference_member);
|
TEST_CASE(dereference_member);
|
||||||
|
@ -220,6 +221,22 @@ private:
|
||||||
TODO_ASSERT_EQUALS("[test.cpp:14] (error) After insert, the iterator 'aI' may be invalid", errout.str());
|
TODO_ASSERT_EQUALS("[test.cpp:14] (error) After insert, the iterator 'aI' may be invalid", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iterator8()
|
||||||
|
{
|
||||||
|
// Ticket #1679
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" std::set<int> s1;\n"
|
||||||
|
" std::set<int> s2;\n"
|
||||||
|
" for (std::set<int>::iterator it = s1.begin(); it != s1.end(); ++it)\n"
|
||||||
|
" {\n"
|
||||||
|
" if (true) { }\n"
|
||||||
|
" if (it != s2.end()) continue;\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:8]: (error) Same iterator is used with both s1 and s2\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// Dereferencing invalid pointer
|
// Dereferencing invalid pointer
|
||||||
void dereference()
|
void dereference()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue