From a03d710b94e32802bcc087357f6134fe05e6b30c Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:43:02 +0200 Subject: [PATCH 1/5] Update astutils.cpp --- lib/astutils.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index f16144310ac..f7383cf7b92 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3426,6 +3426,11 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings if (ftok->variable()->type() && ftok->variable()->type()->classScope) { const int nCtor = ftok->variable()->type()->classScope->numConstructors; if (nCtor == 0) + if (indirect > 0) { + std::vector argvar = getArgumentVars(ftok->astParent(), argnr); + if (argvar.size() == 1 && argvar[0]->valueType() && argvar[0]->valueType()->pointer == indirect) + return ExprUsage::NotUsed; + } return ExprUsage::Used; if (nCtor == 1) { const Scope* scope = ftok->variable()->type()->classScope; From 92f9b2e7ad88235b3e0eccda5565bbe70a4e6575 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:43:41 +0200 Subject: [PATCH 2/5] Update token.cpp --- lib/token.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/token.cpp b/lib/token.cpp index 4d1d2f5890f..c27d8807a63 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -2361,6 +2361,8 @@ const ::Type* Token::typeOf(const Token* tok, const Token** typeTok) return tok->variable()->type(); if (tok->function()) return tok->function()->retType; + if (tok->valueType() && tok->valueType()->typeScope && tok->valueType()->typeScope->definedType) + return tok->valueType()->typeScope->definedType; if (Token::simpleMatch(tok, "return")) { // cppcheck-suppress shadowFunction - TODO: fix this const Scope *scope = tok->scope(); From 199552ab14e6af84a88d719af990b8e3c28c7519 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:45:16 +0200 Subject: [PATCH 3/5] Update testuninitvar.cpp --- test/testuninitvar.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index ecb467524c3..e61579f8024 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -7776,6 +7776,14 @@ class TestUninitVar : public TestFixture { " return (&s)->y;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5:16]: (error) Uninitialized variable: s.y [uninitvar]\n", errout_str()); + + valueFlowUninit("struct S { int* p; };\n" // #14640 + "void f() {\n" + " int x;\n" + " S s{ &x };\n" + " *s.p = 0;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void valueFlowUninitForLoop() From dbe818735e419e976704f1a0362c479a63af817e Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:52:56 +0200 Subject: [PATCH 4/5] Update astutils.cpp --- lib/astutils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index f7383cf7b92..949f954c1e5 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3425,13 +3425,14 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings // TODO: resolve multiple constructors if (ftok->variable()->type() && ftok->variable()->type()->classScope) { const int nCtor = ftok->variable()->type()->classScope->numConstructors; - if (nCtor == 0) + if (nCtor == 0) { if (indirect > 0) { std::vector argvar = getArgumentVars(ftok->astParent(), argnr); if (argvar.size() == 1 && argvar[0]->valueType() && argvar[0]->valueType()->pointer == indirect) return ExprUsage::NotUsed; } return ExprUsage::Used; + } if (nCtor == 1) { const Scope* scope = ftok->variable()->type()->classScope; auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [](const Function& f) { From fe85164c1809f2043a014d503560e8abf0210359 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:09:10 +0200 Subject: [PATCH 5/5] Fix nit [skip ci] --- lib/astutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 949f954c1e5..d77f387f24f 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3427,7 +3427,7 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings const int nCtor = ftok->variable()->type()->classScope->numConstructors; if (nCtor == 0) { if (indirect > 0) { - std::vector argvar = getArgumentVars(ftok->astParent(), argnr); + const std::vector argvar = getArgumentVars(ftok->astParent(), argnr); if (argvar.size() == 1 && argvar[0]->valueType() && argvar[0]->valueType()->pointer == indirect) return ExprUsage::NotUsed; }