Exception Safety: detect unsafe multiple new in a execution path (#831)

This commit is contained in:
Daniel Marjamäki 2009-11-03 19:43:51 +01:00
parent 797e9aeaf5
commit 616a760b6c
3 changed files with 35 additions and 0 deletions

View File

@ -166,4 +166,31 @@ void CheckExceptionSafety::unsafeNew()
}
}
}
// allocating multiple local variables..
std::set<unsigned int> localVars;
unsigned int countNew = 0;
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
{
if (tok->str() == "{" || tok->str() == "}")
{
localVars.clear();
countNew = 0;
}
if (Token::Match(tok, "[;{}] %type% * %var% ;"))
{
tok = tok->tokAt(3);
if (tok->varId())
localVars.insert(tok->varId());
}
if (Token::Match(tok, "; %var% = new"))
{
if (tok->next()->varId() && localVars.find(tok->next()->varId()) != localVars.end())
++countNew;
if (countNew >= 2)
unsafeNewError(tok->next());
}
}
}

View File

@ -46,6 +46,7 @@ public:
{
CheckExceptionSafety checkExceptionSafety(tokenizer, settings, errorLogger);
checkExceptionSafety.destructors();
checkExceptionSafety.unsafeNew();
}

View File

@ -83,6 +83,13 @@ private:
" b = new B;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:4]: (style) Exception safety: unsafe use of 'new'\n", errout.str());
check("void a()\n"
"{\n"
" A *a1 = new A;\n"
" A *a2 = new A;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:4]: (style) Exception safety: unsafe use of 'new'\n", errout.str());
}
};