From 459a4e0cbed50a8b517c37a1a6cf8eb09ca9edd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 10 Nov 2015 10:18:24 +0100 Subject: [PATCH] Fixed #7121 (False positive 'Uninitialized variable' converting pointer to reference) --- lib/checkuninitvar.cpp | 3 +++ test/testuninitvar.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index d058e14ed..d6cbc6337 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -796,6 +796,9 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al } if (Token::Match(vartok->previous(), "++|--|%cop%")) { + if (_tokenizer->isCPP() && alloc == ARRAY && Token::Match(vartok->tokAt(-4), "& %var% =|( *")) + return false; + if (_tokenizer->isCPP() && Token::Match(vartok->previous(), ">>|<<")) { const Token* tok2 = vartok->previous(); if (Token::simpleMatch(tok2->astOperand1(), ">>")) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 52daa2ca4..f8f14d19f 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2743,6 +2743,12 @@ private: TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: x\n", "", errout.str()); + checkUninitVar("void f() {\n" + " int x[10];\n" + " int &x0(*x);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + // .... checkUninitVar("struct ABC { int a; };\n" // struct initialization "void clear(struct ABC &abc);\n" @@ -3581,12 +3587,6 @@ private: "}"); ASSERT_EQUALS("", errout.str()); - checkUninitVar("void f() {\n" - " char *s = malloc(100);\n" - " *s = x;\n" - "}"); - ASSERT_EQUALS("", errout.str()); - checkUninitVar("void f() {\n" " char *p = malloc(100);\n" " p || assert_failed();\n"