Fixed #2207 (False positive: uninitialized variable (return if uninitialized))

This commit is contained in:
Daniel Marjamäki 2010-11-15 20:35:01 +01:00
parent d250cb5aa2
commit 29bb553782
3 changed files with 37 additions and 1 deletions

View File

@ -425,6 +425,20 @@ void ExecutionPath::checkScope(const Token *tok, std::list<ExecutionPath *> &che
if (countif.find((*it)->varId) != countif.end()) if (countif.find((*it)->varId) != countif.end())
(*it)->numberOfIf++; (*it)->numberOfIf++;
} }
// Delete checks that have numberOfIf >= 2
for (it = checks.begin(); it != checks.end();)
{
if ((*it)->varId > 0 && (*it)->numberOfIf >= 2)
{
delete *it;
checks.erase(it++);
}
else
{
++it;
}
}
} }

View File

@ -405,7 +405,8 @@ private:
" p = new FooCar;\n" " p = new FooCar;\n"
" p->abcd();\n" " p->abcd();\n"
"}\n"); "}\n");
ASSERT_EQUALS("[test.cpp:8]: (error) Possible null pointer dereference: p\n", errout.str()); TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Possible null pointer dereference: p\n", errout.str());
ASSERT_EQUALS("", errout.str());
check("static void foo()\n" check("static void foo()\n"
"{\n" "{\n"

View File

@ -546,6 +546,27 @@ private:
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// Ticket #2207 - False negative
checkUninitVar("void foo(int x) {\n"
" int a;\n"
" if (x)\n"
" a = 1;\n"
" b = c - a;\n"
"}\n");
TODO_ASSERT_EQUALS("[test.cpp:5] (error) uninitialized variable a", errout.str());
ASSERT_EQUALS("", errout.str());
// Ticket #2207 - False positive
checkUninitVar("void foo(int x) {\n"
" int a;\n"
" if (x)\n"
" a = 1;\n"
" if (!x)\n"
" return;\n"
" b = (c - a);\n"
"}\n");
ASSERT_EQUALS("", errout.str());
checkUninitVar("int foo()\n" checkUninitVar("int foo()\n"
"{\n" "{\n"
" int ret;\n" " int ret;\n"