From d89967ce8ea71ecdd92f2fe9cd250ea8677e34e9 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 21 Jan 2026 20:27:39 +0000 Subject: [PATCH] C++: Add ''isLiveAtEndOfBlock' predicate to 'Definition'. --- .../code/cpp/ir/dataflow/internal/SsaImpl.qll | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index d4a80ff25c8..28541a3837b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -940,6 +940,11 @@ module SsaCached { SsaImpl::phiHasInputFromBlock(phi, inp, bb) } + cached + predicate ssaDefReachesEndOfBlock(IRBlock bb, Definition def) { + SsaImpl::ssaDefReachesEndOfBlock(bb, def, _) + } + predicate variableRead = SsaInput::variableRead/4; predicate variableWrite = SsaInput::variableWrite/4; @@ -1176,6 +1181,14 @@ class Definition extends SsaImpl::Definition { SsaImpl::uncertainWriteDefinitionInput(this, result) } + /** + * Holds if this SSA definition is live at the end of basic block `bb`. + * That is, this definition reaches the end of basic block `bb`, at which + * point it is still live, without crossing another SSA definition of the + * same source variable. + */ + predicate isLiveAtEndOfBlock(IRBlock bb) { ssaDefReachesEndOfBlock(bb, this) } + /** * Gets a definition that ultimately defines this SSA definition and is * not itself a phi node.