From 87eac7a74a04283a76ee1ac849b98d7602579ccb Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:45:18 +0200 Subject: [PATCH 1/8] Update testuninitvar.cpp --- test/testuninitvar.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 1874e020fa8..b2ebeada5a5 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6788,6 +6788,12 @@ class TestUninitVar : public TestFixture { " return a[0];\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + valueFlowUninit("std::vector f() {\n" // #15077 + " const std::vector a[1];\n" + " return a[0];\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value From 42724872822592ebab7910454f89b2d5f3250ec6 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:46:00 +0200 Subject: [PATCH 2/8] Update valueflow.cpp --- lib/valueflow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 7af430fdce3..dccc24dda57 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5990,7 +5990,7 @@ static bool needsInitialization(const Variable* var) return true; if (var->valueType()->type == ValueType::Type::ITERATOR) return true; - if (var->isStlType() && var->isArray()) { + if (var->isArray() && var->getTypeName() == "std::array") { if (const Token* ctt = var->valueType()->containerTypeToken) { if (ctt->isStandardType()) return true; From 4f82e10d4747a1d50d4c9ed7567895b57ddb0225 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:27:52 +0200 Subject: [PATCH 3/8] Update valueflow.cpp [skip ci] --- lib/valueflow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index dccc24dda57..f734060c0c0 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -727,7 +727,7 @@ static void valueFlowArrayBool(TokenList& tokenlist, const Settings& settings) } if (!var) continue; - if (!var->isArray() || var->isArgument() || var->getTypeName() == "std::array") + if (!var->isArray() || var->isArgument() || var->isStlType("array")) continue; if (isNonZero(getOtherOperand(tok)) && Token::Match(tok->astParent(), "%comp%")) continue; @@ -1169,7 +1169,7 @@ static void valueFlowImpossibleValues(TokenList& tokenList, const Settings& sett value.setImpossible(); setTokenValue(tok, std::move(value), settings); } else if (tok->variable() && tok->variable()->isArray() && !tok->variable()->isArgument() && - tok->variable()->getTypeName() != "std::array") { + !tok->variable()->isStlType("array")) { ValueFlow::Value value{0}; value.setImpossible(); setTokenValue(tok, std::move(value), settings); @@ -5990,7 +5990,7 @@ static bool needsInitialization(const Variable* var) return true; if (var->valueType()->type == ValueType::Type::ITERATOR) return true; - if (var->isArray() && var->getTypeName() == "std::array") { + if (var->isArray() && var->isStlType("array")) { if (const Token* ctt = var->valueType()->containerTypeToken) { if (ctt->isStandardType()) return true; From ad69146a03e266aed0262d56dfeaf165c86552bc Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:28:42 +0200 Subject: [PATCH 4/8] Update checkbufferoverrun.cpp [skip ci] --- lib/checkbufferoverrun.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index bdd18ee21d2..84c8c5895d9 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -607,7 +607,7 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, cons } } - if (!var || var->isPointer() || (astIsContainer(bufTok) && var->getTypeName() != "std::array")) + if (!var || var->isPointer() || (astIsContainer(bufTok) && !var->isStlType("array")) return ValueFlow::Value(-1); const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), MathLib::bigint(1), [](MathLib::bigint i1, const Dimension &dim) { From d859d3c63c4f3837beb934c1a4a82278808f0a5b Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:32:45 +0200 Subject: [PATCH 5/8] Update checkclass.cpp [skip ci] --- lib/checkclass.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 314af14e158..8b09da5d809 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -136,7 +136,7 @@ bool CheckClassImpl::isInitialized(const Usage& usage, FunctionType funcType) co { // needs initialization } - else if (var.getTypeName() == "std::array") { + else if (var.isStlType("array")) { const Token* ctt = var.valueType()->containerTypeToken; if (!ctt->isStandardType() && (!ctt->type() || ctt->type()->needInitialization != Type::NeedInitialization::True) && @@ -1580,15 +1580,7 @@ void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const const Token *tok1 = var.typeStartToken(); const Scope *typeScope = var.typeScope(); - std::string typeName; - if (Token::Match(tok1, "%type% ::")) { - const Token *typeTok = tok1; - while (Token::Match(typeTok, "%type% ::")) { - typeName += typeTok->str() + "::"; - typeTok = typeTok->tokAt(2); - } - typeName += typeTok->str(); - } + const std::string typeName = var.getTypeName(); // check for std:: type if (var.isStlType() && typeName != "std::array" && !mSettings.library.podtype(typeName)) { From 95caefb9219892179e71541a59e83b3dc29b300a Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:33:34 +0200 Subject: [PATCH 6/8] Update checksizeof.cpp [skip ci] --- lib/checksizeof.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 2d9012078a6..735eefd5688 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -87,7 +87,7 @@ void CheckSizeofImpl::checkSizeofForArrayParameter() } const Variable *var = varTok->variable(); - if (var && var->isArray() && var->isArgument() && !var->isReference() && !(var->isStlType() && var->getTypeName() == "std::array")) + if (var && var->isArray() && var->isArgument() && !var->isReference() && !var->isStlType("array")) sizeofForArrayParameterError(tok); } } From b178584c2a6e3b13a2362f6638fccdd90cdd74ed Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:44:46 +0200 Subject: [PATCH 7/8] Update checkbufferoverrun.cpp --- lib/checkbufferoverrun.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 84c8c5895d9..c6bfbf844ca 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -607,7 +607,7 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, cons } } - if (!var || var->isPointer() || (astIsContainer(bufTok) && !var->isStlType("array")) + if (!var || var->isPointer() || (astIsContainer(bufTok) && !var->isStlType("array"))) return ValueFlow::Value(-1); const MathLib::bigint dim = std::accumulate(var->dimensions().cbegin(), var->dimensions().cend(), MathLib::bigint(1), [](MathLib::bigint i1, const Dimension &dim) { From 27c41203d7d0e643e74952d2cfd49a934ec03e68 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:19:19 +0200 Subject: [PATCH 8/8] Update checkclass.cpp --- lib/checkclass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 8b09da5d809..293850b9ee3 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1577,7 +1577,6 @@ void CheckClassImpl::checkMemsetType(const Scope *start, const Token *tok, const } // don't warn if variable static or const, pointer or array of pointers if (!var.isStatic() && !var.isConst() && !var.isPointer() && (!var.isArray() || var.typeEndToken()->str() != "*")) { - const Token *tok1 = var.typeStartToken(); const Scope *typeScope = var.typeScope(); const std::string typeName = var.getTypeName();