Symbol database: reduce false negatives for 'uninitialized variable' when calling base class function. ticket: #1895

This commit is contained in:
Robert Reif 2010-09-12 22:40:51 +02:00 committed by Daniel Marjamäki
parent 84d9282da2
commit 6de1711515
3 changed files with 42 additions and 1 deletions

View File

@ -806,6 +806,33 @@ void CheckClass::SpaceInfo::clearAllVar()
//---------------------------------------------------------------------------
bool CheckClass::SpaceInfo::isBaseClassFunc(const Token *tok)
{
// Iterate through each base class...
for (unsigned int i = 0; i < derivedFrom.size(); ++i)
{
const SpaceInfo *info = derivedFrom[i].spaceInfo;
// Check if base class exists in database
if (info)
{
std::list<Func>::const_iterator it;
for (it = info->functionList.begin(); it != info->functionList.end(); ++it)
{
if (it->tokenDef->str() == tok->str())
return true;
}
}
// Base class not found so assume it is in it.
else
return true;
}
return false;
}
void CheckClass::SpaceInfo::initializeVarList(const Func &func, std::list<std::string> &callstack)
{
bool Assign = false;
@ -964,7 +991,7 @@ void CheckClass::SpaceInfo::initializeVarList(const Func &func, std::list<std::s
else
{
// could be a base class virtual function, so we assume it initializes everything
if (!derivedFrom.empty())
if (isBaseClassFunc(ftok))
assignAllVar();
// has friends, so we assume it initializes everything

View File

@ -295,6 +295,8 @@ private:
}
return 0;
}
bool isBaseClassFunc(const Token *tok);
};
/** @brief Information about all namespaces/classes/structrues */

View File

@ -1879,6 +1879,18 @@ private:
" int i;\n"
"};\n");
ASSERT_EQUALS("[test.cpp:4]: (style) Member variable not initialized in the constructor 'Fred::i'\n", errout.str());
// Unknown non-member function
checkUninitVar("class ABC { };\n"
"class Fred : private ABC\n"
"{\n"
"public:\n"
" Fred() { Init(); }\n"
"private:\n"
" int i;\n"
"};\n");
ASSERT_EQUALS("[test.cpp:5]: (style) Member variable not initialized in the constructor 'Fred::i'\n", errout.str());
}
void uninitVarEnum()