From 09f426d98005a9ccae7bbf83458412969022d897 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:50:49 +0200 Subject: [PATCH] Fix #12082 FP uninitvar for assignment to array member in conditional (#5570) --- lib/astutils.cpp | 6 ++++-- test/testuninitvar.cpp | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index f417ad704..2d6620629 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3249,9 +3249,11 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings, bool cpp) { - const Token* const parent = tok->astParent(); + const Token* parent = tok->astParent(); if (indirect > 0 && parent) { - if (Token::Match(parent, "%assign%") && astIsRHS(tok)) + while (Token::simpleMatch(parent, "[") && parent->astParent()) + parent = parent->astParent(); + if (Token::Match(parent, "%assign%") && (astIsRHS(tok) || astIsLHS(parent->astOperand1()))) return ExprUsage::NotUsed; if (parent->isConstOp()) return ExprUsage::NotUsed; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 7e7a2cdd6..74ca1a898 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6289,6 +6289,14 @@ private: " foo(q);\n" "}\n"); ASSERT_EQUALS("[test.cpp:9]: (error) Uninitialized variable: q\n", errout.str()); + + valueFlowUninit("int g();\n" // #12082 + "void f() {\n" + " int a[1], b[1];\n" + " while (a[0] = g()) {}\n" + " if ((b[0] = g()) == 0) {}\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value