From c8b8e25fbb6bde1eb8f59ba98338e2c2616c49b0 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 5 May 2025 18:50:04 -0400 Subject: [PATCH] Convert post-update logic to IR (part 1) --- .../go/dataflow/internal/DataFlowNodes.qll | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 79026544d4d..cf93dd042f3 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -807,12 +807,18 @@ module Public { abstract Node getPreUpdateNode(); } + predicate insnHasPostUpdateNode(IR::Instruction insn) { + exists(Expr e | insn.(IR::EvalInstruction).getExpr() = e | + e instanceof AddressExpr or + e = any(AddressExpr ae).getOperand() or + e = any(StarExpr ae).getBase() or + e = any(DerefExpr ae).getOperand() or + e = any(IR::EvalImplicitDerefInstruction eidi).getOperand() + ) + } + predicate hasPostUpdateNode(Node preupd) { - preupd instanceof AddressOperationNode - or - preupd = any(AddressOperationNode addr).getOperand() - or - preupd = any(PointerDereferenceNode deref).getOperand() + insnHasPostUpdateNode(preupd.asInstruction()) or preupd = getAWrittenNode() or