From 3a432fa95914c0f1dfeca6670e5919aa1656a461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 15 Dec 2011 16:55:55 +0100 Subject: [PATCH] Uninitialized variables: better handling of initialization with >>. Ticket: #3369 --- lib/checkuninitvar.cpp | 9 +++++---- test/testuninitvar.cpp | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 1fc520f55..2d518ae8f 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1130,10 +1130,6 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const unsigned int // variable is seen.. if (tok->varId() == varid) { - // Assign variable - if (tok->previous()->str() == ">>" || tok->next()->str() == "=") - return true; - // Use variable if (isVariableUsage(tok)) uninitvarError(tok, tok->str()); @@ -1156,6 +1152,11 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok) const return true; if (Token::Match(vartok->previous(), "++|--|%op%")) { + if (vartok->previous()->str() == ">>" && _tokenizer->isCPP()) { + // assume that variable is initialized + return false; + } + if (vartok->previous()->str() != "&" || !Token::Match(vartok->tokAt(-2), "[(,]")) { return true; } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 26d6d6513..5bb07622b 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1682,7 +1682,7 @@ private: /** New checking that doesn't rely on ExecutionPath */ - void checkUninitVar2(const char code[]) { + void checkUninitVar2(const char code[], const char fname[] = "test.cpp") { // Clear the error buffer.. errout.str(""); @@ -1691,7 +1691,7 @@ private: // Tokenize.. Tokenizer tokenizer(&settings, this); std::istringstream istr(code); - tokenizer.tokenize(istr, "test.cpp"); + tokenizer.tokenize(istr, fname); tokenizer.simplifyTokenList(); // Check for redundant code.. @@ -1732,6 +1732,20 @@ private: "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: x\n", errout.str()); + // >> => initialization / usage + { + const char code[] = "void f() {\n" + " int x;\n" + " if (i >> x) { }\n" + "}"; + + checkUninitVar2(code, "test.cpp"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar2(code, "test.c"); + ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: x\n", errout.str()); + } + // conditional initialization checkUninitVar2("void f() {\n" " int x;\n"