From b8fab85c1f9e4535582cc5e1bdecfd4fe48fe329 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 4 May 2026 20:32:23 +0200 Subject: [PATCH 1/3] #14719 FP uninitdata for new array with initializer --- lib/checkuninitvar.cpp | 9 +++++++-- test/testuninitvar.cpp | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 3d1a0ecccc5..b74e7725f09 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -788,8 +788,13 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var 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::Match(initTok->link(), "] [({]")) + 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.. From c501ff39b638504682fb823c7f31a9d5d85c3481 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 4 May 2026 20:53:13 +0200 Subject: [PATCH 2/3] Fix --- lib/checkuninitvar.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index b74e7725f09..ae9b49b38f0 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -784,15 +784,14 @@ 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")) { const Token* initTok = tok->tokAt(4); - while (Token::Match(initTok, "::|%type")) + while (Token::Match(initTok, "::|%type%")) initTok = initTok->next(); - if (Token::Match(initTok->link(), "] [({]")) + if (Token::simpleMatch(initTok, "[")) + initTok = initTok->link()->next(); + if (Token::Match(initTok, "[({]")) return true; } } From 131c220b33a9f746b4cebe6d7b2f9b4db32d85a3 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 4 May 2026 21:03:59 +0200 Subject: [PATCH 3/3] Fix --- lib/checkuninitvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index ae9b49b38f0..2e749c6b71e 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -785,7 +785,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var if (var.typeStartToken()->isStandardType() || var.typeStartToken()->isEnumType()) { // scalar new with initialization // array new - if (Token::Match(tok->next(), "= new ::|%type")) { + if (Token::Match(tok->next(), "= new ::|%type%")) { const Token* initTok = tok->tokAt(4); while (Token::Match(initTok, "::|%type%")) initTok = initTok->next();