From e8d37ed6af81ce22c84efb30a049f9a94b77a998 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 10 Oct 2025 23:07:57 +0200 Subject: [PATCH] Fix #14191 FP uninitvar with conditional pointer reassignment --- lib/vf_analyzers.cpp | 2 ++ test/testuninitvar.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 1b70b4446d1..fc64f237c39 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -608,6 +608,8 @@ struct ValueFlowAnalyzer : Analyzer { for (const ValueFlow::Value& v:ref->astOperand1()->values()) { if (!v.isLocalLifetimeValue()) continue; + if (v.conditional) + continue; if (lifeTok) return Action::None; lifeTok = v.tokvalue; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 9652bbc5e59..051649ac77a 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -7936,6 +7936,20 @@ class TestUninitVar : public TestFixture { " return s;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + valueFlowUninit("struct S { int i; };\n" // #14191 + "bool g(S*);\n" + "void f( struct S *p) {\n" + " struct S s;\n" + " if (!p) {\n" + " p = &s;\n" + " if (g(p))\n" + " return;\n" + " }\n" + " printf(\"%i\", p->i);\n" + " p = &s;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } template