From 8738223e82d003be4dafef481e51adc355206df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=E4ki?= Date: Sat, 26 Jan 2013 08:16:53 +0100 Subject: [PATCH] Fixed #4512 (Improve check: Uninitialized variable not detected) --- lib/checkuninitvar.cpp | 4 ++++ test/testuninitvar.cpp | 6 ++++++ 2 files changed, 10 insertions(+) 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"