diff --git a/lib/bughuntingchecks.cpp b/lib/bughuntingchecks.cpp index 4f4e18904..8c8cb0b8e 100644 --- a/lib/bughuntingchecks.cpp +++ b/lib/bughuntingchecks.cpp @@ -173,8 +173,17 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine: } } - if (!value.isUninit() && uninitStructMember.empty()) - return; + bool uninitData = false; + if (!value.isUninit() && uninitStructMember.empty()) { + if (Token::Match(tok->astParent(), "[(,]")) { + if (const auto* arrayValue = dynamic_cast(&value)) { + uninitData = arrayValue->data.size() >= 1 && arrayValue->data[0].value->isUninit(); + } + } + + if (!uninitData) + return; + } // lhs in assignment if (tok->astParent()->str() == "=" && tok == tok->astParent()->astOperand1()) @@ -239,8 +248,11 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine: const Variable *argvar = parent->astOperand1()->function()->getArgumentVar(count); if (argvar && argvar->isReference() && !argvar->isConst()) return; + if (uninitData && argvar && !argvar->isConst()) + return; } - } + } else if (uninitData) + return; } // Avoid FP for array declaration diff --git a/test/testbughuntingchecks.cpp b/test/testbughuntingchecks.cpp index 537f214c2..60e716bf1 100644 --- a/test/testbughuntingchecks.cpp +++ b/test/testbughuntingchecks.cpp @@ -69,7 +69,7 @@ private: check("char foo(const char id[]);\n" "void bar() { char data[10]; foo(data); }"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Cannot determine that 'data' is initialized\n", errout.str()); check("char foo(char id[]);\n" "void bar() { char data[10]; foo(data); }");