From dac1b6867a7be181c28e0f873368ecec7de1f546 Mon Sep 17 00:00:00 2001 From: yoff Date: Mon, 16 May 2022 09:12:06 +0000 Subject: [PATCH] python: Avoid abstract class in public interface use construction from Ruby with `ParameterNodeImpl` --- .../new/internal/DataFlowDispatchPointsTo.qll | 14 +++++++++++++- .../dataflow/new/internal/DataFlowPublic.qll | 9 ++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatchPointsTo.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatchPointsTo.qll index 1c2d88362b0..6a40750c8dd 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatchPointsTo.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatchPointsTo.qll @@ -651,8 +651,20 @@ class SummaryCall extends DataFlowCall, TSummaryCall { override Location getLocation() { result = c.getLocation() } } +/** + * The value of a parameter at function entry, viewed as a node in a data + * flow graph. + */ +abstract class ParameterNodeImpl extends Node { + /** + * Holds if this node is the parameter of callable `c` at the + * (zero-based) index `i`. + */ + abstract predicate isParameterOf(DataFlowCallable c, int i); +} + /** A parameter for a library callable with a flow summary. */ -class SummaryParameterNode extends ParameterNode, TSummaryParameterNode { +class SummaryParameterNode extends ParameterNodeImpl, TSummaryParameterNode { private FlowSummaryImpl::Public::SummarizedCallable sc; private int pos; diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll index 3325ca5f3cb..6311b60fdc6 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll @@ -111,6 +111,8 @@ newtype TNode = FlowSummaryImpl::Private::summaryParameterNodeRange(c, pos) } +class TParameterNode = TCfgNode or TSummaryParameterNode; + /** Helper for `Node::getEnclosingCallable`. */ private DataFlowCallable getCallableScope(Scope s) { result.getScope() = s @@ -286,15 +288,16 @@ ExprNode exprNode(DataFlowExpr e) { result.getNode().getNode() = e } * The value of a parameter at function entry, viewed as a node in a data * flow graph. */ -abstract class ParameterNode extends Node { +class ParameterNode extends Node, TParameterNode instanceof ParameterNodeImpl { /** * Holds if this node is the parameter of callable `c` at the * (zero-based) index `i`. */ - abstract predicate isParameterOf(DataFlowCallable c, int i); + final predicate isParameterOf(DataFlowCallable c, int i) { super.isParameterOf(c, i) } } -class SourceParameterNode extends ParameterNode, CfgNode { +/** A parameter node foudn in the source code (not in a summary). */ +class SourceParameterNode extends ParameterNodeImpl, CfgNode { //, LocalSourceNode { ParameterDefinition def;