Fixed #4907 (False positive "uninitStructMember" on structs with unions)

This commit is contained in:
Daniel Marjamäki 2013-09-23 07:20:20 +02:00
parent 64454068ec
commit ee14ea4fc2
2 changed files with 25 additions and 0 deletions

View File

@ -1101,11 +1101,22 @@ void CheckUninitVar::checkScope(const Scope* scope)
for (std::size_t j = 0U; j < symbolDatabase->classAndStructScopes.size(); ++j) {
const Scope *scope2 = symbolDatabase->classAndStructScopes[j];
if (scope2->className == structname && scope2->numConstructors == 0U) {
bool hasUnion = false;
for (std::list<Scope*>::const_iterator childscope = scope2->nestedList.begin();
childscope != scope2->nestedList.end();
++childscope) {
if ((*childscope)->type == Scope::eUnion)
hasUnion = true;
}
if (hasUnion)
break;
for (std::list<Variable>::const_iterator it = scope2->varlist.begin(); it != scope2->varlist.end(); ++it) {
const Variable &var = *it;
if (!var.isArray())
checkScopeForVariable(scope, tok, *i, NULL, NULL, var.name());
}
break;
}
}
}

View File

@ -2788,6 +2788,20 @@ private:
"}\n", "test.c");
ASSERT_EQUALS("", errout.str());
checkUninitVar2("struct PIXEL {\n" // union in struct #4970
" union {\n"
" struct { unsigned char red,green,blue,alpha; };\n"
" unsigned int color;\n"
" };\n"
"};\n"
"\n"
"unsigned char f() {\n"
" struct PIXEL p1;\n"
" p1.color = 255;\n"
" return p1.red;\n"
"}");
ASSERT_EQUALS("", errout.str());
// return
checkUninitVar2("struct AB { int a; int b; };\n"
"void f(void) {\n"