diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 3d1a0ecccc5..2e749c6b71e 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -784,12 +784,16 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var // standard or enum type: check if new initializes the allocated memory if (var.typeStartToken()->isStandardType() || var.typeStartToken()->isEnumType()) { // scalar new with initialization - if (Token::Match(tok->next(), "= new %type% (")) - return true; - // array new - if (Token::Match(tok->next(), "= new %type% [") && Token::simpleMatch(tok->linkAt(4), "] (")) - return true; + if (Token::Match(tok->next(), "= new ::|%type%")) { + const Token* initTok = tok->tokAt(4); + while (Token::Match(initTok, "::|%type%")) + initTok = initTok->next(); + if (Token::simpleMatch(initTok, "[")) + initTok = initTok->link()->next(); + if (Token::Match(initTok, "[({]")) + return true; + } } continue; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 960fee4ee87..e22c4009f5d 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2181,6 +2181,26 @@ class TestUninitVar : public TestFixture { " return s;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + checkUninitVar("int f() {\n" // #14719 + " int* p = new int[]{ 1, 2 };\n" + " int i = p[0] + p[1];\n" + " delete[] p;\n" + " return i;\n" + "}\n" + "int g() {\n" + " int* p = new std::int32_t[]{ 1, 2 };\n" + " int i = p[0] + p[1];\n" + " delete[] p;\n" + " return i;\n" + "}\n" + "int h() {\n" + " int* p = new ::std::int32_t[]{ 1, 2 };\n" + " int i = p[0] + p[1];\n" + " delete[] p;\n" + " return i;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } // class / struct..