From b908bb18a9c72882fabd48e28982f5f91db7900b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 30 Jan 2016 20:48:28 +0100 Subject: [PATCH] Fixed #5503 (FP: Uninitialized variable - initialize in in if and else branch) --- lib/checkuninitvar.cpp | 10 +++++++++- test/testuninitvar.cpp | 11 +++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 9de455774..1965e8961 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -205,6 +205,14 @@ static void conditionAlwaysTrueOrFalse(const Token *tok, const std::mapisComparisonOp()) { + if (tok->values.size() == 1U && tok->values.front().isKnown()) { + if (tok->values.front().intvalue) + *alwaysTrue = true; + else + *alwaysFalse = true; + return; + } + const Token *vartok, *numtok; if (tok->astOperand2() && tok->astOperand2()->isNumber()) { vartok = tok->astOperand1(); @@ -404,7 +412,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var return true; } - if (alwaysTrue && noreturnIf) + if (alwaysTrue && (initif || noreturnIf)) return true; std::map varValueIf; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 2754fcd49..47f81de30 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -778,6 +778,17 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + checkUninitVar("int foo(int x)\n" // #5503 + "{\n" + " int i;\n" + " if (x < 2)\n" + " i = 22;\n" + " else if (x >= 2)\n" // condition is always true + " i = 33;\n" + " return i;\n" + "}"); + ASSERT_EQUALS("", errout.str()); + checkUninitVar("int foo()\n" "{\n" " int i;\n"