Fixed #1783 (false positive: uninitalized variable in constructor/operator=, when calling overloaded functions)
This commit is contained in:
parent
70bfa890a8
commit
5de124280a
|
@ -339,9 +339,15 @@ void CheckClass::initializeVarList(const Token *tok1, const Token *ftok, Var *va
|
||||||
if (ftok->str() == "if")
|
if (ftok->str() == "if")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// No recursive calls!
|
// recursive call / calling overloaded function
|
||||||
if (std::find(callstack.begin(), callstack.end(), ftok->str()) == callstack.end())
|
// assume that all variables are initialized
|
||||||
|
if (std::find(callstack.begin(), callstack.end(), ftok->str()) != callstack.end())
|
||||||
{
|
{
|
||||||
|
for (Var *var = varlist; var; var = var->next)
|
||||||
|
var->init = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
const Token *ftok2 = _tokenizer->findClassFunction(tok1, classname, ftok->strAt(0), i, isStruct);
|
const Token *ftok2 = _tokenizer->findClassFunction(tok1, classname, ftok->strAt(0), i, isStruct);
|
||||||
if (ftok2)
|
if (ftok2)
|
||||||
|
@ -402,7 +408,6 @@ void CheckClass::initializeVarList(const Token *tok1, const Token *ftok, Var *va
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Assignment of member variable?
|
// Assignment of member variable?
|
||||||
else if (Token::Match(ftok, "%var% ="))
|
else if (Token::Match(ftok, "%var% ="))
|
||||||
|
|
|
@ -73,6 +73,7 @@ private:
|
||||||
TEST_CASE(uninitFunction1); // No FP when initialized in function
|
TEST_CASE(uninitFunction1); // No FP when initialized in function
|
||||||
TEST_CASE(uninitFunction2); // No FP when initialized in function
|
TEST_CASE(uninitFunction2); // No FP when initialized in function
|
||||||
TEST_CASE(uninitSameClassName); // No FP when two classes have the same name
|
TEST_CASE(uninitSameClassName); // No FP when two classes have the same name
|
||||||
|
TEST_CASE(uninitFunctionOverload); // No FP when there are overloaded functions
|
||||||
|
|
||||||
TEST_CASE(noConstructor1);
|
TEST_CASE(noConstructor1);
|
||||||
TEST_CASE(noConstructor2);
|
TEST_CASE(noConstructor2);
|
||||||
|
@ -2035,6 +2036,28 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninitFunctionOverload()
|
||||||
|
{
|
||||||
|
// Ticket #1783 - overloaded "init" functions
|
||||||
|
checkUninitVar("class A\n"
|
||||||
|
"{\n"
|
||||||
|
"private:\n"
|
||||||
|
" int i;\n"
|
||||||
|
"\n"
|
||||||
|
"public:\n"
|
||||||
|
" A()\n"
|
||||||
|
" {\n"
|
||||||
|
" init();\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" void init() { init(0); }\n"
|
||||||
|
"\n"
|
||||||
|
" void init(int value)\n"
|
||||||
|
" { i = value; }\n"
|
||||||
|
"};");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void checkNoConstructor(const char code[])
|
void checkNoConstructor(const char code[])
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue