diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 1596d9e69..f10fcf593 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1498,6 +1498,10 @@ bool CheckUninitVar::isVariableUsage(const Scope* scope, const Token *vartok, bo if ((pointer || address) && Token::Match(argStart, "const %type% * %var% [,)]")) return true; } + + } else if (Token::Match(start->previous(), "if|while|for")) { + // control-flow statement reading the variable "by value" + return true; } } } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index e8375d07f..48bd74cd9 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2010,6 +2010,12 @@ private: ASSERT_EQUALS("", errout.str()); // using uninit var in condition + checkUninitVar2("void f(void) {\n" + " int x;\n" + " if (x) { }\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: x\n", errout.str()); + checkUninitVar2("void f() {\n" " int x;\n" " if (1 == (3 & x)) { }\n"