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