From 47c7e346aabf4f07a42da840191a8246df48034f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 6 Feb 2012 19:26:28 +0100 Subject: [PATCH] Uninitialized variables: Another fix for false positives when it's known that inner conditions are true --- lib/checkuninitvar.cpp | 4 ++-- test/testuninitvar.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index a1a1cadc1..5b49bd81f 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1113,8 +1113,8 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const unsigned int } // assignment with nonzero constant.. - if (Token::Match(tok, "[;{}] %var% = - %var% ;") && tok->next()->varId() > 0) - notzero.insert(tok->next()->varId()); + if (Token::Match(tok->previous(), "[;{}] %var% = - %var% ;") && tok->varId() > 0) + notzero.insert(tok->varId()); // Inner scope.. if (Token::simpleMatch(tok, "if (")) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 4cc978559..a6f318c21 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1893,6 +1893,16 @@ private: "}\n"); ASSERT_EQUALS("", errout.str()); + checkUninitVar2("void f() {\n" + " int i, y;\n" + " if (x) {\n" + " y = -ENOMEM;\n" + " if (y != 0) return;\n" + " i++;\n" + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + // for, while checkUninitVar2("void f() {\n" " int x;\n"