mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Shared: Add a 'getReturnValueKind' predicate and use it in 'interpretOutput' and 'interpretInput' to handle non-standard return value input/output. This is needed to support C++'s ReturnValue[**] notation.
This commit is contained in:
@@ -54,6 +54,20 @@ signature module InputSig<LocationSig Location, DF::InputSig<Location> 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)
|
||||
|
||||
Reference in New Issue
Block a user