diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 37d7a1ec0cd..4acf003af99 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1593,7 +1593,7 @@ void CheckUninitVarImpl::uninitvarError(const Token* tok, const ValueFlow::Value const std::string& varname = ltok ? ltok->expressionString() : "x"; ErrorPath errorPath = v.errorPath; errorPath.emplace_back(tok, ""); - auto severity = v.isKnown() ? Severity::error : Severity::warning; + auto severity = v.isKnown() && !v.conditional ? Severity::error : Severity::warning; auto certainty = v.isInconclusive() ? Certainty::inconclusive : Certainty::normal; if (v.subexpressions.empty()) { reportError(std::move(errorPath), diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 57940b1b3fd..a889d126cd5 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -95,6 +95,7 @@ class TestUninitVar : public TestFixture { TEST_CASE(valueFlowUninitBreak); TEST_CASE(valueFlowUninitStructMembers); TEST_CASE(valueFlowUninitForLoop); + TEST_CASE(valueFlowUninitErrorPath); TEST_CASE(uninitvar_ipa); TEST_CASE(uninitvar_memberfunction); TEST_CASE(uninitvar_nonmember); // crash in ycmd test @@ -7945,6 +7946,23 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void valueFlowUninitErrorPath() + { + setMultiline(); + + valueFlowUninit("void f(bool b) {\n" + " int i;\n" + " if (b)\n" + " return i;\n" + " i = 1;\n" + " return i;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:16]: warning: Uninitialized variable: i [uninitvar]\n" + "[test.cpp:3:9]: note: Assuming condition is true\n" + "[test.cpp:4:16]: note: Uninitialized variable: i\n", + errout_str()); + } + void uninitvar_memberfunction() { // # 8715 valueFlowUninit("struct C {\n"