From b798bc2c8f62e816383008447caac85edefccd09 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 12 Feb 2026 11:32:36 +0100 Subject: [PATCH] Java: Fix enhancedForEarlyExit implementation. --- java/ql/lib/semmle/code/java/dataflow/Nullness.qll | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll index ac568be7b91..a9d969a8301 100644 --- a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll +++ b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll @@ -17,6 +17,7 @@ private import NullGuards private import semmle.code.java.Collections private import semmle.code.java.controlflow.internal.Preconditions private import semmle.code.java.controlflow.ControlFlowReachability +private import codeql.controlflow.SuccessorType /** Gets an expression that may be `null`. */ Expr nullExpr() { result = nullExpr(_) } @@ -230,14 +231,8 @@ private Expr nonEmptyExpr() { /** The control flow edge that exits an enhanced for loop if the `Iterable` is empty. */ private predicate enhancedForEarlyExit(EnhancedForStmt for, ControlFlowNode n1, ControlFlowNode n2) { - exists(Expr forExpr | - n1.getANormalSuccessor() = n2 and - for.getExpr() = forExpr and - forExpr.getAChildExpr*() = n1.asExpr() and - not forExpr.getAChildExpr*() = n2.asExpr() and - n1.getANormalSuccessor().asExpr() = for.getVariable() and - not n2.asExpr() = for.getVariable() - ) + n1.getASuccessor(any(EmptinessSuccessor t | t.isEmpty())) = n2 and + for.getExpr().getControlFlowNode() = n1 } /** A control flow edge that cannot be taken. */