From bae4faa786728751def508780ec5da25667870d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 16 Nov 2019 11:47:57 +0100 Subject: [PATCH] Fixed #9422 (FP uninitdata - writing pointer to output stream) --- lib/checkuninitvar.cpp | 11 +---------- test/testuninitvar.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 2f707140c..1d614d715 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1093,16 +1093,7 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al } if (mTokenizer->isCPP() && Token::simpleMatch(vartok->next(), "<<")) { - // Is this calculation done in rhs? - const Token *tok = vartok; - while (Token::Match(tok, "%name%|.|::")) - tok = tok->previous(); - if (Token::Match(tok, "[;{}]")) - return false; - - // Is variable a known POD type then this is a variable usage, - // otherwise we assume it's not. - return (vartok->valueType() && vartok->valueType()->isIntegral()); + return false; } if (alloc == NO_ALLOC && vartok->next() && vartok->next()->isOp() && !vartok->next()->isAssignmentOp()) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 0f028512e..1952a7b6e 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -475,6 +475,39 @@ private: " os << 1 << a;\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); + + { + // #9422 + checkUninitVar("void f() {\n" + " char *p = new char[10];\n" + " std::cout << (void *)p << 1;\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f() {\n" + " char p[10];\n" + " std::cout << (void *)p << 1;\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f() {\n" + " char *p = new char[10];\n" + " std::cout << p << 1;\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory is allocated but not initialized: p\n", errout.str()); + + checkUninitVar("void f() {\n" + " char p[10];\n" + " std::cout << p << 1;\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n", errout.str()); + + checkUninitVar("void f() {\n" + " char p[10];\n" + " std::cout << *p << 1;\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n", errout.str()); + } } // #8494 : Overloaded & operator