Fixed #1496 (false positive: Member variable not initialized in the constructor 'X::m_d')
This commit is contained in:
parent
c0e09c4cb3
commit
258e7e292e
|
@ -275,7 +275,7 @@ void CheckClass::initializeVarList(const Token *tok1, const Token *ftok, Var *va
|
|||
{
|
||||
for (Var *var = varlist; var; var = var->next)
|
||||
var->init = true;
|
||||
break;
|
||||
return;
|
||||
}
|
||||
|
||||
// Clearing array..
|
||||
|
@ -286,12 +286,23 @@ void CheckClass::initializeVarList(const Token *tok1, const Token *ftok, Var *va
|
|||
continue;
|
||||
}
|
||||
|
||||
else if (ftok->str() == "if")
|
||||
continue;
|
||||
|
||||
// Calling member function?
|
||||
else if (Token::Match(ftok, "%var% ("))
|
||||
{
|
||||
// Passing "this" => assume that everything is initialized
|
||||
for (const Token * tok2 = ftok->next()->link(); tok2 && tok2 != ftok; tok2 = tok2->previous())
|
||||
{
|
||||
if (tok2->str() == "this")
|
||||
{
|
||||
for (Var *var = varlist; var; var = var->next)
|
||||
var->init = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (ftok->str() == "if")
|
||||
continue;
|
||||
|
||||
// No recursive calls!
|
||||
if (std::find(callstack.begin(), callstack.end(), ftok->str()) == callstack.end())
|
||||
{
|
||||
|
|
|
@ -63,6 +63,8 @@ private:
|
|||
TEST_CASE(uninitVarHeader3); // Class is defined in header
|
||||
TEST_CASE(uninitVarPublished); // Variables in the published section are auto-initialized
|
||||
TEST_CASE(uninitOperator); // No FP about uninitialized 'operator[]'
|
||||
TEST_CASE(uninitFunction1); // No FP when initialized in function
|
||||
TEST_CASE(uninitFunction2); // No FP when initialized in function
|
||||
|
||||
TEST_CASE(noConstructor1);
|
||||
TEST_CASE(noConstructor2);
|
||||
|
@ -1425,6 +1427,36 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void uninitFunction1()
|
||||
{
|
||||
checkUninitVar("class Fred\n"
|
||||
"{\n"
|
||||
"public:\n"
|
||||
" Fred() { init(*this); }\n"
|
||||
"\n"
|
||||
" static void init(Fred &f)\n"
|
||||
" { f.d = 0; }\n"
|
||||
"\n"
|
||||
" double d;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void uninitFunction2()
|
||||
{
|
||||
checkUninitVar("class Fred\n"
|
||||
"{\n"
|
||||
"public:\n"
|
||||
" Fred() { if (!init(*this)); }\n"
|
||||
"\n"
|
||||
" static bool init(Fred &f)\n"
|
||||
" { f.d = 0; return true; }\n"
|
||||
"\n"
|
||||
" double d;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void checkNoConstructor(const char code[])
|
||||
{
|
||||
// Tokenize..
|
||||
|
|
Loading…
Reference in New Issue