From e0dc451da339405d5ecd29aff51a1c98bbe0526b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:24:25 +0200 Subject: [PATCH 1/5] Update checkuninitvar.cpp --- lib/checkuninitvar.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 7fd9a063d64..f3aa30c8f5d 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1641,6 +1641,8 @@ 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(), ".")) + continue; const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; From 1c7d691091f803349e395e5e7a9a1966a2b0168d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:27:37 +0200 Subject: [PATCH 2/5] Update checkuninitvar.cpp --- lib/checkuninitvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index f3aa30c8f5d..7c6236cea23 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1641,7 +1641,7 @@ 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(), ".")) + if (isarray && tok->variable()->isStlType() && Token::simpleMatch(tok->astParent(), ".") && astContainerYield(tok) != Library::Container::Yield::AT_INDEX) continue; const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings); uninitderef = deref && v->indirect == 0; From 8240e32fdcb2acf33f153bf753b42cfb6996c09d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:28:45 +0200 Subject: [PATCH 3/5] Update testuninitvar.cpp --- test/testuninitvar.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e1a98d03a16..8f06b06a1bb 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6542,6 +6542,15 @@ 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" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value From 5e3b23f2346eb8be1730613337a0261342a777a2 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:33:54 +0200 Subject: [PATCH 4/5] Update checkuninitvar.cpp --- lib/checkuninitvar.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 7c6236cea23..8d973d7e369 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1641,8 +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(), ".") && astContainerYield(tok) != Library::Container::Yield::AT_INDEX) - continue; + 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; From b69c5b98713fb969ed756a20747fce9c03ec6b74 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:40:45 +0200 Subject: [PATCH 5/5] Update testuninitvar.cpp --- test/testuninitvar.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 8f06b06a1bb..6aeb223a619 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6549,8 +6549,10 @@ class TestUninitVar : public TestFixture { " std::array b;\n" " auto it = b.begin();\n" " *it = 0;\n" + " std::array c;\n" + " return c.front();\n" "}\n"); - ASSERT_EQUALS("", errout_str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Uninitialized variable: c\n", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value