Support do-loops in CheckStl::stlOutOfBounds()
This commit is contained in:
parent
621644b17a
commit
bb8c8d53cc
|
@ -308,12 +308,14 @@ void CheckStl::stlOutOfBounds()
|
||||||
for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
|
for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
|
||||||
const Token* tok = i->classDef;
|
const Token* tok = i->classDef;
|
||||||
// only interested in conditions
|
// only interested in conditions
|
||||||
if ((i->type != Scope::eFor && i->type != Scope::eWhile && i->type != Scope::eIf) || !tok)
|
if ((i->type != Scope::eFor && i->type != Scope::eWhile && i->type != Scope::eIf && i->type != Scope::eDo) || !tok)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (i->type == Scope::eFor)
|
if (i->type == Scope::eFor)
|
||||||
tok = Token::findsimplematch(tok->tokAt(2), ";");
|
tok = Token::findsimplematch(tok->tokAt(2), ";");
|
||||||
else
|
else if (i->type == Scope::eDo) {
|
||||||
|
tok = tok->linkAt(1)->tokAt(2);
|
||||||
|
} else
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
|
|
||||||
// check if the for loop condition is wrong
|
// check if the for loop condition is wrong
|
||||||
|
@ -331,7 +333,7 @@ void CheckStl::stlOutOfBounds()
|
||||||
// variable id for the container variable
|
// variable id for the container variable
|
||||||
const unsigned int declarationId = container->declarationId();
|
const unsigned int declarationId = container->declarationId();
|
||||||
|
|
||||||
for (const Token *tok3 = tok->tokAt(8); tok3 && tok3 != i->classEnd; tok3 = tok3->next()) {
|
for (const Token *tok3 = i->classStart; tok3 && tok3 != i->classEnd; tok3 = tok3->next()) {
|
||||||
if (tok3->varId() == declarationId) {
|
if (tok3->varId() == declarationId) {
|
||||||
if (Token::Match(tok3->next(), ". size|length ( )"))
|
if (Token::Match(tok3->next(), ". size|length ( )"))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -547,6 +547,14 @@ private:
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str());
|
||||||
|
|
||||||
|
check("void foo(const std::string& foo, unsigned int ii) {\n"
|
||||||
|
" do {\n"
|
||||||
|
" foo[ii] = 'x';\n"
|
||||||
|
" ++i;\n"
|
||||||
|
" } while(ii <= foo.length());\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str());
|
||||||
|
|
||||||
check("void foo(const std::string& foo, unsigned int ii) {\n"
|
check("void foo(const std::string& foo, unsigned int ii) {\n"
|
||||||
" if (anything()) {\n"
|
" if (anything()) {\n"
|
||||||
" } else if (ii <= foo.length()) {\n"
|
" } else if (ii <= foo.length()) {\n"
|
||||||
|
|
Loading…
Reference in New Issue