From da139763aae2409476a4107488293a23b9d9b42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 11 May 2026 17:05:19 +0200 Subject: [PATCH 1/2] add test --- test/testuninitvar.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 1366b350223..db499dabf72 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -80,7 +80,8 @@ class TestUninitVar : public TestFixture { TEST_CASE(uninitvar_unconditionalTry); TEST_CASE(uninitvar_funcptr); // #6404 TEST_CASE(uninitvar_operator); // #6680 - TEST_CASE(uninitvar_ternaryexpression); // #4683 + TEST_CASE(uninitvar_ternaryexpression1); // #4683 + TEST_CASE(uninitvar_ternaryexpression2); // #14729 TEST_CASE(uninitvar_pointertoarray); TEST_CASE(uninitvar_cpp11ArrayInit); // #7010 TEST_CASE(uninitvar_rangeBasedFor); // #7078 @@ -5447,7 +5448,7 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("", errout_str()); } - void uninitvar_ternaryexpression() { // #4683 + void uninitvar_ternaryexpression1() { // #4683 checkUninitVar("struct B { int asd; };\n" "int f() {\n" " int a=0;\n" @@ -5461,6 +5462,14 @@ class TestUninitVar : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void uninitvar_ternaryexpression2() { // #14729 + checkUninitVar("void f(bool b, int i) {\n" + " int *p = (int*) malloc(4);\n" + " int *q = b ? p : &i;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } + void uninitvar_rangeBasedFor() { checkUninitVar("void function(Entry& entry) {\n" // #7078 " for (auto* expr : entry.exprs) {\n" From 6d3d2c9a6276ee6496646cb995a2d46b5b5002ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 11 May 2026 17:00:23 +0200 Subject: [PATCH 2/2] fix --- lib/checkuninitvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 9ff66c055ef..a7a4d8b1bf3 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -383,7 +383,7 @@ static bool isVariableUsed(const Token *tok, const Variable& var) return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var); if (tok->varId() != var.declarationId()) return false; - if (!var.isArray()) + if (!var.isArray() && !var.isPointer()) return true; const Token *parent = tok->astParent();