stl: after vector::insert, iterators may become invalid
This commit is contained in:
parent
01af70cc88
commit
ffbf8e38ac
|
@ -299,7 +299,7 @@ void CheckStl::pushback()
|
||||||
|
|
||||||
std::string vectorname;
|
std::string vectorname;
|
||||||
int indent = 0;
|
int indent = 0;
|
||||||
bool invalidIterator = false;
|
std::string invalidIterator;
|
||||||
for (const Token *tok2 = tok; indent >= 0 && tok2; tok2 = tok2->next())
|
for (const Token *tok2 = tok; indent >= 0 && tok2; tok2 = tok2->next())
|
||||||
{
|
{
|
||||||
if (tok2->str() == "{" || tok2->str() == "(")
|
if (tok2->str() == "{" || tok2->str() == "(")
|
||||||
|
@ -341,14 +341,14 @@ void CheckStl::pushback()
|
||||||
pushback = 0;
|
pushback = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (Token::Match(tok3, "%varid% . push_front|push_back (", vectorid))
|
else if (Token::Match(tok3, "%varid% . push_front|push_back|insert (", vectorid))
|
||||||
{
|
{
|
||||||
pushback = tok3;
|
pushback = tok3->tokAt(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pushback)
|
if (pushback)
|
||||||
pushbackError(pushback, tok2->strAt(0));
|
pushbackError(pushback, pushback->str(), tok2->strAt(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigning iterator..
|
// Assigning iterator..
|
||||||
|
@ -358,20 +358,20 @@ void CheckStl::pushback()
|
||||||
vectorname = tok2->strAt(2);
|
vectorname = tok2->strAt(2);
|
||||||
else
|
else
|
||||||
vectorname = "";
|
vectorname = "";
|
||||||
invalidIterator = false;
|
invalidIterator = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// push_back on vector..
|
// push_back on vector..
|
||||||
if (vectorname.size() && Token::Match(tok2, (vectorname + " . push_front|push_back").c_str()))
|
if (vectorname.size() && Token::Match(tok2, (vectorname + " . push_front|push_back|insert").c_str()))
|
||||||
invalidIterator = true;
|
invalidIterator = tok2->strAt(2);
|
||||||
|
|
||||||
// Using invalid iterator..
|
// Using invalid iterator..
|
||||||
if (invalidIterator)
|
if (!invalidIterator.empty())
|
||||||
{
|
{
|
||||||
if (Token::Match(tok2, "++|--|*|+|-|(|,|=|!= %varid%", iteratorid))
|
if (Token::Match(tok2, "++|--|*|+|-|(|,|=|!= %varid%", iteratorid))
|
||||||
pushbackError(tok2, tok2->strAt(1));
|
pushbackError(tok2, invalidIterator, tok2->strAt(1));
|
||||||
if (Token::Match(tok2, "%varid% ++|--|+|-", iteratorid))
|
if (Token::Match(tok2, "%varid% ++|--|+|-", iteratorid))
|
||||||
pushbackError(tok2, tok2->str());
|
pushbackError(tok2, invalidIterator, tok2->str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -381,9 +381,9 @@ void CheckStl::pushback()
|
||||||
|
|
||||||
|
|
||||||
// Error message for bad iterator usage..
|
// Error message for bad iterator usage..
|
||||||
void CheckStl::pushbackError(const Token *tok, const std::string &iterator_name)
|
void CheckStl::pushbackError(const Token *tok, const std::string &func, const std::string &iterator_name)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::error, "pushback", "After push_back or push_front, the iterator '" + iterator_name + "' may be invalid");
|
reportError(tok, Severity::error, "pushback", "After " + func + ", the iterator '" + iterator_name + "' may be invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
void erase();
|
void erase();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dangerous usage of push_back
|
* Dangerous usage of push_back and insert
|
||||||
*/
|
*/
|
||||||
void pushback();
|
void pushback();
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ private:
|
||||||
void stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var);
|
void stlOutOfBoundsError(const Token *tok, const std::string &num, const std::string &var);
|
||||||
void iteratorsError(const Token *tok, const std::string &container1, const std::string &container2);
|
void iteratorsError(const Token *tok, const std::string &container1, const std::string &container2);
|
||||||
void eraseError(const Token *tok);
|
void eraseError(const Token *tok);
|
||||||
void pushbackError(const Token *tok, const std::string &iterator_name);
|
void pushbackError(const Token *tok, const std::string &func, const std::string &iterator_name);
|
||||||
void invalidPointerError(const Token *tok, const std::string &pointer_name);
|
void invalidPointerError(const Token *tok, const std::string &pointer_name);
|
||||||
void stlBoundriesError(const Token *tok, const std::string &container_name);
|
void stlBoundriesError(const Token *tok, const std::string &container_name);
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ private:
|
||||||
dereferenceErasedError(0, "iter");
|
dereferenceErasedError(0, "iter");
|
||||||
stlOutOfBoundsError(0, "i", "foo");
|
stlOutOfBoundsError(0, "i", "foo");
|
||||||
eraseError(0);
|
eraseError(0);
|
||||||
pushbackError(0, "iterator");
|
pushbackError(0, "push_back|push_front|insert", "iterator");
|
||||||
invalidPointerError(0, "pointer");
|
invalidPointerError(0, "pointer");
|
||||||
stlBoundriesError(0, "container");
|
stlBoundriesError(0, "container");
|
||||||
}
|
}
|
||||||
|
|
|
@ -342,7 +342,7 @@ private:
|
||||||
" foo.push_back(123);\n"
|
" foo.push_back(123);\n"
|
||||||
" *it;\n"
|
" *it;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (error) After push_back or push_front, the iterator 'it' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (error) After push_back, the iterator 'it' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushback2()
|
void pushback2()
|
||||||
|
@ -371,7 +371,7 @@ private:
|
||||||
" foo.push_back(123);\n"
|
" foo.push_back(123);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back or push_front, the iterator 'it' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back, the iterator 'it' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushback4()
|
void pushback4()
|
||||||
|
@ -419,7 +419,7 @@ private:
|
||||||
" v.push_back(10);\n"
|
" v.push_back(10);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:9]: (error) After push_back or push_front, the iterator 'it' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:9]: (error) After push_back, the iterator 'it' may be invalid\n", errout.str());
|
||||||
|
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -432,7 +432,7 @@ private:
|
||||||
" v.push_back(10);\n"
|
" v.push_back(10);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:9]: (error) After push_back or push_front, the iterator 'it' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:9]: (error) After push_back, the iterator 'it' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushback7()
|
void pushback7()
|
||||||
|
@ -447,7 +447,7 @@ private:
|
||||||
" foo.push_back(123);\n"
|
" foo.push_back(123);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back or push_front, the iterator 'it' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back, the iterator 'it' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushback8()
|
void pushback8()
|
||||||
|
@ -464,7 +464,7 @@ private:
|
||||||
" sum += *it;\n"
|
" sum += *it;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back or push_front, the iterator 'end' may be invalid\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:8]: (error) After push_back, the iterator 'end' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -476,7 +476,7 @@ private:
|
||||||
" ints.insert(ints.begin(), 1);\n"
|
" ints.insert(ints.begin(), 1);\n"
|
||||||
" ++iter;\n"
|
" ++iter;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Invalid iterator 'iter' after insert\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (error) After insert, the iterator 'iter' may be invalid\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue