From b76607127271064a2422dd2677a09fd4bff8fc93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 1 Nov 2014 14:03:02 +0100 Subject: [PATCH] Fixed #4970 (false positive: conditionally initialized variable used in if-clause (git/notes.c)) --- lib/checkuninitvar.cpp | 2 ++ test/testuninitvar.cpp | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 4a9ca7e03..e68ef85a1 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1525,6 +1525,8 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok, bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Variable& var, bool suppressErrors, bool isuninit, bool alloc, const std::string &membervar) { const Token * const endpar = startparentheses->link(); + if (Token::Match(startparentheses, "( ! %var% %oror%") && startparentheses->tokAt(2)->getValue(0)) + suppressErrors = true; for (const Token *tok = startparentheses->next(); tok && tok != endpar; tok = tok->next()) { if (tok->varId() == var.declarationId()) { if (Token::Match(tok, "%var% . %var%")) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index a23dd5a8d..0b16df101 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2405,6 +2405,13 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + checkUninitVar2("static void f() {\n" + " int a=0, b;\n" + " if (something) { a = dostuff(&b); }\n" + " if (!a || b) { }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + checkUninitVar2("static void f(int x, int y) {\n" " int a;\n" " if (x == 0 && (a == 1)) { }\n" @@ -2798,7 +2805,7 @@ private: " if (!x) i = 0;\n" " if (!x || i>0) {}\n" // <- error "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", "", errout.str()); checkUninitVar2("void f(int x) {\n" " int i;\n"