diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 95d29153f47..d9efa7a8449 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -54,6 +54,20 @@ signature module InputSig Lang> { /** Gets the return kind corresponding to specification `"ReturnValue"`. */ Lang::ReturnKind getStandardReturnValueKind(); + /** + * Gets the return kind corresponding to specification `"ReturnValue"` when + * the supplied argument `arg`. + * + * Note that it is expected that the following equality holds: + * ``` + * getReturnValueKind("") = getStandardReturnValueKind() + * ``` + */ + default Lang::ReturnKind getReturnValueKind(string arg) { + arg = "" and + result = getStandardReturnValueKind() + } + /** Gets the textual representation of parameter position `pos` used in MaD. */ string encodeParameterPosition(Lang::ParameterPosition pos); @@ -2164,9 +2178,15 @@ module Make< ) ) or - c = "ReturnValue" and - node.asNode() = - getAnOutNodeExt(mid.asCall(), TValueReturn(getStandardReturnValueKind())) + c.getName() = "ReturnValue" and + exists(ReturnKind rk | + not exists(c.getAnArgument()) and + rk = getStandardReturnValueKind() + or + rk = getReturnValueKind(c.getAnArgument()) + | + node.asNode() = getAnOutNodeExt(mid.asCall(), TValueReturn(rk)) + ) or SourceSinkInterpretationInput::interpretOutput(c, mid, node) ) @@ -2198,12 +2218,16 @@ module Make< ) ) or - exists(ReturnNode ret, ValueReturnKind kind | - c = "ReturnValue" and + exists(ReturnNode ret, ReturnKind kind | + c.getName() = "ReturnValue" and ret = node.asNode() and - kind.getKind() = ret.getKind() and - kind.getKind() = getStandardReturnValueKind() and + kind = ret.getKind() and mid.asCallable() = getNodeEnclosingCallable(ret) + | + not exists(c.getAnArgument()) and + kind = getStandardReturnValueKind() + or + kind = getReturnValueKind(c.getAnArgument()) ) or SourceSinkInterpretationInput::interpretInput(c, mid, node)