From ee14ea4fc277dede02ae4ceeb5c8e8d6987dcd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 23 Sep 2013 07:20:20 +0200 Subject: [PATCH] Fixed #4907 (False positive "uninitStructMember" on structs with unions) --- lib/checkuninitvar.cpp | 11 +++++++++++ test/testuninitvar.cpp | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index b70754e24..664a56231 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -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::const_iterator childscope = scope2->nestedList.begin(); + childscope != scope2->nestedList.end(); + ++childscope) { + if ((*childscope)->type == Scope::eUnion) + hasUnion = true; + } + if (hasUnion) + break; + for (std::list::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; } } } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 504338d58..a0172da7c 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -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"