From 0c9eb5d1903c1d2b74f15ff1110afc6f2d2658b6 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Sat, 8 Jan 2022 03:47:28 -0600 Subject: [PATCH] Fix 10681: FP ctuuninitvar with array member (#3686) --- lib/valueflow.cpp | 3 +++ test/testuninitvar.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index d8a4b2260..bf09904b2 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6786,6 +6786,9 @@ static void valueFlowUninit(TokenList* tokenlist, SymbolDatabase* /*symbolDataba for (const Variable& memVar : scope->varlist) { if (!memVar.isPublic()) continue; + // Skip array since we cant track partial initialization from nested subexpressions + if (memVar.isArray()) + continue; if (!needsInitialization(&memVar, tokenlist->isCPP())) { partial = true; continue; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 2848d6aa4..9be06e73b 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -5921,6 +5921,35 @@ private: " x = a.m;\n" "}"); ASSERT_EQUALS("", errout.str()); + + valueFlowUninit("struct S {\n" + " int t[1];\n" + "};\n" + "int f(const S* ps) {\n" + " return ps->t[0];\n" + "}\n" + "void g() {\n" + " S s;\n" + " s.t[0] = 1;\n" + " f(&s);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + valueFlowUninit("struct X {\n" + " int a, b;\n" + "};\n" + "struct S {\n" + " X t;\n" + "};\n" + "int f(const S* ps) {\n" + " return ps->t.a;\n" + "}\n" + "void g() {\n" + " S s;\n" + " s.t.a = 1;\n" + " f(&s);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void uninitvar_memberfunction() {