From a0784a4062b184aeef7329dc38c5e997d5d7a437 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 4 May 2026 20:05:32 +0200 Subject: [PATCH 1/2] Fix #14724 FP: overlapping inner condition, function call --- lib/checkcondition.cpp | 2 +- test/testcondition.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index a8a4281b58b..1b761ce4802 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -684,7 +684,7 @@ void CheckCondition::multiCondition2() if (!nonlocal && var) { if (!(var->isLocal() || var->isArgument())) nonlocal = true; - else if ((var->isPointer() || var->isReference()) && !Token::Match(cond->astParent(), "%oror%|&&|!")) + else if ((var->isPointer() || var->isReference() || var->isArray()) && !Token::Match(cond->astParent(), "%oror%|&&|!")) // TODO: if var is pointer check what it points at nonlocal = true; } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index a9e55268253..8837fe94ada 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -3029,6 +3029,15 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("", errout_str()); + + check("void g(int[]);\n" // #14724 + "void f(int a[]) {\n" + " if (a[0] == 1) {\n" + " g(a);\n" + " if (a[0] == 1) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout_str()); } void overlappingInnerCondition() { From aed19114a5848899944c1905e615d2cb394f4fff Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 4 May 2026 20:11:06 +0200 Subject: [PATCH 2/2] Add test --- test/testcondition.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 8837fe94ada..9737217add3 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -2843,6 +2843,15 @@ class TestCondition : public TestFixture { " return 0;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("void f(int x, int y) {\n" + " int a[] = { x, y };\n" + " if (a[0] == 1) {\n" + " if (a[0] == 1) {}\n" + " }\n" + "}"); + ASSERT_EQUALS("[test.cpp:3:14] -> [test.cpp:4:18]: (warning) Identical inner 'if' condition is always true. [identicalInnerCondition]\n", + errout_str()); } void identicalConditionAfterEarlyExit() {