diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll index 59efe2fe3e3..4371d0221ea 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll @@ -15,7 +15,9 @@ private predicate isInterfaceCallReceiver( /** Gets a data-flow node that may flow into the receiver value of `call`, which is an interface value. */ private DataFlow::Node getInterfaceCallReceiverSource(DataFlow::CallNode call) { - isInterfaceCallReceiver(call, result.getASuccessor*(), _, _) + exists(DataFlow::Node succ | basicLocalFlowStep*(result, succ) | + isInterfaceCallReceiver(call, succ, _, _) + ) } /** Gets the type of `nd`, which must be a valid type and not an interface type. */ @@ -37,7 +39,7 @@ private predicate isConcreteValue(DataFlow::Node nd) { ( exists(getConcreteType(nd)) or - forex(DataFlow::Node pred | pred = nd.getAPredecessor() | isConcreteValue(pred)) + forex(DataFlow::Node pred | basicLocalFlowStep(pred, nd) | isConcreteValue(pred)) ) } diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 52cd5ebf1cb..1e0fa7e6221 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -428,7 +428,7 @@ module Public { */ private DataFlow::Node getACalleeSource(DataFlow::CallNode cn) { result = cn.getCalleeNode() or - result.getASuccessor() = getACalleeSource(cn) + basicLocalFlowStep(result, getACalleeSource(cn)) } /** A data flow node that represents a call. */