diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 7fd9a063d64..8d973d7e369 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1641,6 +1641,11 @@ void CheckUninitVar::valueFlowUninit() const bool isarray = tok->variable()->isArray(); if (isarray && tok->variable()->isMember()) continue; // Todo: this is a bailout + if (isarray && tok->variable()->isStlType() && Token::simpleMatch(tok->astParent(), ".")) { + const auto yield = astContainerYield(tok); + if (yield != Library::Container::Yield::AT_INDEX && yield != Library::Container::Yield::ITEM) + continue; + } const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e1a98d03a16..6aeb223a619 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6542,6 +6542,17 @@ class TestUninitVar : public TestFixture { "[test.cpp:12]: (error) Uninitialized variable: b\n" "[test.cpp:16]: (error) Uninitialized variable: a\n", errout_str()); + + valueFlowUninit("void f() {\n" // # 12932 + " std::array a;\n" + " if (a.begin() == a.end()) {}\n" + " std::array b;\n" + " auto it = b.begin();\n" + " *it = 0;\n" + " std::array c;\n" + " return c.front();\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:8]: (error) Uninitialized variable: c\n", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value