From 194afbb7f8ea3e7c3d44f50cf0d79a995ad6faa9 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 18 Feb 2025 09:35:49 +0100 Subject: [PATCH] Java: Simplify SSA for variable capture. --- .../code/java/dataflow/internal/SsaImpl.qll | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll index bcc68cfd873..9937d0b696e 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll @@ -490,26 +490,11 @@ private module Cached { ) } - pragma[nomagic] - private predicate captureDefReaches(Definition def, SsaInput::BasicBlock bb2, int i2) { - variableCapture(def.getSourceVariable(), _, _, _) and - exists(SsaInput::BasicBlock bb1, int i1 | - Impl::adjacentDefRead(def, bb1, i1, bb2, i2) and - def.definesAt(_, bb1, i1) - ) - or - exists(SsaInput::BasicBlock bb3, int i3 | - captureDefReaches(def, bb3, i3) and - SsaInput::variableRead(bb3, i3, _, _) and - Impl::adjacentDefRead(def, bb3, i3, bb2, i2) - ) - } - /** Holds if `init` is a closure variable that captures the value of `capturedvar`. */ cached predicate captures(SsaImplicitInit init, SsaVariable capturedvar) { exists(BasicBlock bb, int i | - captureDefReaches(capturedvar, bb, i) and + Impl::ssaDefReachesRead(_, capturedvar, bb, i) and variableCapture(capturedvar.getSourceVariable(), init.getSourceVariable(), bb, i) ) }