mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Address review comment
This commit is contained in:
@@ -90,10 +90,10 @@ final class DataFlowCall extends TDataFlowCall {
|
||||
}
|
||||
|
||||
/**
|
||||
* The position of a parameter or an argument in a function or call.
|
||||
* The position of a parameter in a function.
|
||||
*
|
||||
* As there is a 1-to-1 correspondence between parameter positions and
|
||||
* arguments positions in Rust we use the same type for both.
|
||||
* In Rust there is a 1-to-1 correspondence between parameter positions and
|
||||
* arguments positions, so we use the same underlying type for both.
|
||||
*/
|
||||
final class ParameterPosition extends TParameterPosition {
|
||||
/** Gets the underlying integer position, if any. */
|
||||
@@ -126,6 +126,22 @@ final class ParameterPosition extends TParameterPosition {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The position of an argument in a call.
|
||||
*
|
||||
* In Rust there is a 1-to-1 correspondence between parameter positions and
|
||||
* arguments positions, so we use the same underlying type for both.
|
||||
*/
|
||||
final class ArgumentPosition extends ParameterPosition {
|
||||
/** Gets the argument of `call` at this position, if any. */
|
||||
Expr getArgument(CallExprBase call) {
|
||||
result = call.getArgList().getArg(this.getPosition())
|
||||
or
|
||||
this.isSelf() and
|
||||
result = call.(MethodCallExpr).getReceiver()
|
||||
}
|
||||
}
|
||||
|
||||
/** Holds if `call` invokes a qualified path that resolves to a method. */
|
||||
private predicate callToMethod(CallExpr call) {
|
||||
exists(Path path |
|
||||
@@ -432,6 +448,8 @@ private module Aliases {
|
||||
|
||||
class ParameterPositionAlias = ParameterPosition;
|
||||
|
||||
class ArgumentPositionAlias = ArgumentPosition;
|
||||
|
||||
class ContentAlias = Content;
|
||||
|
||||
class ContentSetAlias = ContentSet;
|
||||
@@ -550,7 +568,7 @@ module RustDataFlow implements InputSig<Location> {
|
||||
|
||||
class ParameterPosition = ParameterPositionAlias;
|
||||
|
||||
class ArgumentPosition = ParameterPosition;
|
||||
class ArgumentPosition = ArgumentPositionAlias;
|
||||
|
||||
/**
|
||||
* Holds if the parameter position `ppos` matches the argument position
|
||||
|
||||
@@ -58,7 +58,9 @@ module Input implements InputSig<Location, RustDataFlow> {
|
||||
|
||||
string encodeParameterPosition(ParameterPosition pos) { result = pos.toString() }
|
||||
|
||||
predicate encodeArgumentPosition = encodeParameterPosition/1;
|
||||
string encodeArgumentPosition(RustDataFlow::ArgumentPosition pos) {
|
||||
result = encodeParameterPosition(pos)
|
||||
}
|
||||
|
||||
string encodeContent(ContentSet cs, string arg) {
|
||||
exists(Content c | cs = TSingletonContentSet(c) |
|
||||
@@ -143,30 +145,24 @@ private module StepsInput implements Impl::Private::StepsInputSig {
|
||||
result.asCallBaseExprCfgNode().getCallExprBase() = sc.(LibraryCallable).getACall()
|
||||
}
|
||||
|
||||
private Expr getArg(CallExprBase call, ParameterPosition pos) {
|
||||
result = call.getArgList().getArg(pos.getPosition())
|
||||
or
|
||||
result = call.(MethodCallExpr).getReceiver() and pos.isSelf()
|
||||
}
|
||||
|
||||
RustDataFlow::Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponent sc) {
|
||||
sc = Impl::Private::SummaryComponent::return(_) and
|
||||
result.asExpr().getExpr() = source.getCall()
|
||||
or
|
||||
exists(CallExprBase call, Expr arg, ParameterPosition pos |
|
||||
exists(CallExprBase call, Expr arg, ArgumentPosition pos |
|
||||
result.(RustDataFlow::PostUpdateNode).getPreUpdateNode().asExpr().getExpr() = arg and
|
||||
sc = Impl::Private::SummaryComponent::argument(pos) and
|
||||
call = source.getCall() and
|
||||
arg = getArg(call, pos)
|
||||
arg = pos.getArgument(call)
|
||||
)
|
||||
}
|
||||
|
||||
RustDataFlow::Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) {
|
||||
exists(CallExprBase call, Expr arg, ParameterPosition pos |
|
||||
exists(CallExprBase call, Expr arg, ArgumentPosition pos |
|
||||
result.asExpr().getExpr() = arg and
|
||||
sc = Impl::Private::SummaryComponent::argument(pos) and
|
||||
call = sink.getCall() and
|
||||
arg = getArg(call, pos)
|
||||
arg = pos.getArgument(call)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user