From 706eff2b14be180ecc1a102cae61dffb019a269d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 11 Oct 2024 11:59:44 +0100 Subject: [PATCH] PS: Us control-flow nodes in 'ReturnContainer' instead of dataflow nodes. --- .../dataflow/internal/DataFlowPrivate.qll | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll index d253ac48a73..1ac1566c18f 100644 --- a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll @@ -494,7 +494,7 @@ private module ReturnNodes { /** * Gets a direct node that will may be returned when evaluating this node. */ - Node getANode() { none() } + CfgNode getANode() { none() } /** Gets a child that may produce more nodes that may be returned. */ abstract ReturnContainer getAChild(); @@ -503,7 +503,7 @@ private module ReturnNodes { * Gets a (possibly transitive) node that may be returned when evaluating * this node. */ - final Node getAReturnedNode() { + final CfgNode getAReturnedNode() { result = this.getANode() or result = this.getAChild().getAReturnedNode() @@ -519,7 +519,7 @@ private module ReturnNodes { } class CmdExprReturnContainer extends ReturnContainer, CmdExpr { - final override ExprNode getANode() { result.getExprNode().getExpr() = this.getExpr() } + final override CfgNodes::ExprCfgNode getANode() { result.getExpr() = this.getExpr() } final override ReturnContainer getAChild() { none() } } @@ -551,17 +551,25 @@ private module ReturnNodes { } class CmdBaseReturnContainer extends ReturnContainer, CmdExpr { - final override ExprNode getANode() { result.getExprNode().getExpr() = this.getExpr() } + final override CfgNodes::ExprCfgNode getANode() { result.getExpr() = this.getExpr() } final override ReturnContainer getAChild() { none() } } class CmdReturnContainer extends ReturnContainer, Cmd { - final override StmtNode getANode() { result.getStmtNode().getStmt() = this } + final override CfgNodes::StmtCfgNode getANode() { result.getStmt() = this } final override ReturnContainer getAChild() { none() } } + /** Holds if `n` is returned from the enclosing callable. */ + predicate isReturned(CfgNodes::AstCfgNode n) { + exists(ReturnContainer container | + container = n.getScope() and + n = container.getAReturnedNode() + ) + } + class NormalReturnNode extends ReturnNode instanceof NodeImpl { NormalReturnNode() { exists(ReturnContainer container |