Fixed #2171 (false positive: possible nullpointer dereference)
This commit is contained in:
parent
06ec4d9a84
commit
f3bf14ba13
|
@ -436,14 +436,20 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
|
|||
void CheckNullPointer::nullPointerByCheckAndDeRef()
|
||||
{
|
||||
// Check if pointer is NULL and then dereference it..
|
||||
std::set<unsigned int> pointerVariables;
|
||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "if ( ! %var% ) {"))
|
||||
if (Token::Match(tok, "* %var% [;,)=]"))
|
||||
pointerVariables.insert(tok->next()->varId());
|
||||
|
||||
else if (Token::Match(tok, "if ( ! %var% ) {"))
|
||||
{
|
||||
bool null = true;
|
||||
const unsigned int varid(tok->tokAt(3)->varId());
|
||||
if (varid == 0)
|
||||
continue;
|
||||
if (pointerVariables.find(varid) == pointerVariables.end())
|
||||
continue;
|
||||
unsigned int indentlevel = 1;
|
||||
for (const Token *tok2 = tok->tokAt(6); tok2; tok2 = tok2->next())
|
||||
{
|
||||
|
|
|
@ -672,20 +672,29 @@ private:
|
|||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void foo() {\n"
|
||||
check("void foo(char *p) {\n"
|
||||
" if (!p) {\n"
|
||||
" switch (x) { }\n"
|
||||
" }\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void foo(bool p) {\n"
|
||||
check("void foo(char *p) {\n"
|
||||
" if (!p) {\n"
|
||||
" }\n"
|
||||
" return *x;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// operator!
|
||||
check("void f() {\n"
|
||||
" A a;\n"
|
||||
" if (!a) {\n"
|
||||
" a.x();\n"
|
||||
" }\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// This is why this check can't be used on the simplified token list
|
||||
check("void f(Foo *foo) {\n"
|
||||
" if (!dynamic_cast<bar *>(foo)) {\n"
|
||||
|
|
Loading…
Reference in New Issue