diff --git a/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/ql/lib/semmle/go/dataflow/ExternalFlow.qll index aca47e9fac2..c68cff90fdb 100644 --- a/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -396,6 +396,13 @@ SourceOrSinkElement interpretElement( ) } +/** Holds if there is an external specification for `f`. */ +predicate hasExternalSpecification(Function f) { + f = any(SummarizedCallable sc).asFunction() + or + exists(SourceOrSinkElement e | f = e.asEntity() | sourceElement(e, _, _) or sinkElement(e, _, _)) +} + private predicate parseField(string c, DataFlow::FieldContent f) { specSplit(_, c, _) and exists(string fieldRegex, string package, string className, string fieldName | diff --git a/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index b2f574756a5..4cfefeb5b6b 100644 --- a/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -713,11 +713,7 @@ module Public { or exists(c.(MethodCallNode).getTarget().getBody()) or - exists(string package, string type, string name | - c.(MethodCallNode).getTarget().hasQualifiedName(package, type, name) - | - exists(interpretElement(package, type, _, name, "", _)) - ) + hasExternalSpecification(c.(DataFlow::MethodCallNode).getTarget()) ) }