Handle alias variables in CheckClass::initializeVarList() (#6921)
This commit is contained in:
parent
aca8a69f5e
commit
db342ea910
|
@ -730,6 +730,14 @@ void CheckClass::initializeVarList(const Function &func, std::list<const Functio
|
|||
// Assignment of member variable?
|
||||
else if (Token::Match(ftok, "%name% =")) {
|
||||
assignVar(ftok->str(), scope, usage);
|
||||
bool bailout = ftok->variable() && ftok->variable()->isReference();
|
||||
const Token* tok2 = ftok->tokAt(2);
|
||||
if (tok2->str() == "&") {
|
||||
tok2 = tok2->next();
|
||||
bailout = true;
|
||||
}
|
||||
if (tok2->variable() && (bailout || tok2->variable()->isArray()) && tok2->strAt(1) != "[")
|
||||
assignVar(tok2->str(), scope, usage);
|
||||
}
|
||||
|
||||
// Assignment of array item of member variable?
|
||||
|
|
|
@ -104,6 +104,8 @@ private:
|
|||
TEST_CASE(initvar_destructor); // No variables need to be initialized in a destructor
|
||||
TEST_CASE(initvar_func_ret_func_ptr); // ticket #4449
|
||||
|
||||
TEST_CASE(initvar_alias); // #6921
|
||||
|
||||
TEST_CASE(operatorEqSTL);
|
||||
|
||||
TEST_CASE(uninitVar1);
|
||||
|
@ -1389,6 +1391,54 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void initvar_alias() { // #6921
|
||||
check("struct S {\n"
|
||||
" int a;\n"
|
||||
" S() {\n"
|
||||
" int& pa = a;\n"
|
||||
" pa = 4;\n"
|
||||
" }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct S {\n"
|
||||
" int a;\n"
|
||||
" S() {\n"
|
||||
" int* pa = &a;\n"
|
||||
" *pa = 4;\n"
|
||||
" }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct S {\n"
|
||||
" int a[2];\n"
|
||||
" S() {\n"
|
||||
" int* pa = a;\n"
|
||||
" for (int i = 0; i < 2; i++)\n"
|
||||
" *pa++ = i;\n"
|
||||
" }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct S {\n"
|
||||
" int* a[2];\n"
|
||||
" S() {\n"
|
||||
" int* pa = a[1];\n"
|
||||
" *pa = 0;\n"
|
||||
" }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str());
|
||||
|
||||
check("struct S {\n"
|
||||
" int a;\n"
|
||||
" S() {\n"
|
||||
" int pa = a;\n"
|
||||
" pa = 4;\n"
|
||||
" }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str());
|
||||
}
|
||||
|
||||
void operatorEqSTL() {
|
||||
check("class Fred\n"
|
||||
"{\n"
|
||||
|
|
Loading…
Reference in New Issue