Fixed false positives about uninitialized member variables if variable has a default value (#5500)
This commit is contained in:
parent
3923618b8d
commit
41a54fceba
|
@ -1128,7 +1128,7 @@ void CheckUninitVar::checkStruct(const Scope* scope, const Token *tok, const Var
|
|||
if (scope2->className == structname && scope2->numConstructors == 0U) {
|
||||
for (std::list<Variable>::const_iterator it = scope2->varlist.begin(); it != scope2->varlist.end(); ++it) {
|
||||
const Variable &var = *it;
|
||||
if (!var.isArray()) {
|
||||
if (!var.hasDefault() && !var.isArray()) {
|
||||
// is the variable declared in a inner union?
|
||||
bool innerunion = false;
|
||||
for (std::list<Scope>::const_iterator it2 = symbolDatabase->scopeList.begin(); it2 != symbolDatabase->scopeList.end(); ++it2) {
|
||||
|
|
|
@ -912,7 +912,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
|
|||
else if (var->type()->needInitialization == Type::Unknown)
|
||||
unknown = true;
|
||||
}
|
||||
} else
|
||||
} else if (!var->hasDefault())
|
||||
needInitialization = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -2427,6 +2427,22 @@ private:
|
|||
" { }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// non static data-member initialization
|
||||
check("struct POINT\n"
|
||||
"{\n"
|
||||
" int x=0;\n"
|
||||
" int y=0;\n"
|
||||
"};\n"
|
||||
"class Fred\n"
|
||||
"{\n"
|
||||
"private:\n"
|
||||
" POINT p;\n"
|
||||
"public:\n"
|
||||
" Fred()\n"
|
||||
" { }\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void uninitVarUnion1() { // ticket #3196
|
||||
|
|
|
@ -3203,6 +3203,15 @@ private:
|
|||
" int *p = ab.a;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// non static data-member initialization
|
||||
checkUninitVar2("struct AB { int a=1; int b; };\n"
|
||||
"void f(void) {\n"
|
||||
" struct AB ab;\n"
|
||||
" int a = ab.a;\n"
|
||||
" int b = ab.b;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized struct member: ab.b\n", errout.str());
|
||||
}
|
||||
|
||||
void uninitvar2_while() {
|
||||
|
|
Loading…
Reference in New Issue