Fixed #2299 (false positive: possible nullpointer dereference)

This commit is contained in:
Daniel Marjamäki 2010-12-17 21:09:12 +01:00
parent 845d1491f9
commit 696550abd3
2 changed files with 28 additions and 1 deletions

View File

@ -315,7 +315,21 @@ void CheckNullPointer::nullPointerStructByDeRefAndChec()
else if (Token::Match(tok1->tokAt(-2), "%var% ( %var% . %var%") || else if (Token::Match(tok1->tokAt(-2), "%var% ( %var% . %var%") ||
Token::Match(tok1->previous(), ", %var% . %var%")) Token::Match(tok1->previous(), ", %var% . %var%"))
{ {
// Is the function return value taken by the pointer?
bool assignment = false;
const unsigned int varid1(tok1->varId());
const Token *tok2 = tok1->previous();
while (tok2 && !Token::Match(tok2, "[;{}]"))
{
if (Token::Match(tok2, "%varid% =", varid1))
{
assignment = true;
break;
}
tok2 = tok2->previous();
}
if (assignment)
continue;
} }
// Goto next token // Goto next token
@ -399,6 +413,11 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
for (const Token *tok1 = tok->previous(); tok1 && tok1 != decltok; tok1 = tok1->previous()) for (const Token *tok1 = tok->previous(); tok1 && tok1 != decltok; tok1 = tok1->previous())
{ {
if (tok1->str() == ")" && Token::Match(tok1->link()->tokAt(-3), "%varid% = %var%", varid))
{
break;
}
if (tok1->varId() == varid) if (tok1->varId() == varid)
{ {
bool unknown = false; bool unknown = false;

View File

@ -387,6 +387,14 @@ private:
" ;\n" " ;\n"
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
check("void foo(x *p)\n"
"{\n"
" p = bar(p->next);\n"
" if (!p)\n"
" ;\n"
"}\n");
ASSERT_EQUALS("", errout.str());
} }
void nullpointer5() void nullpointer5()