mirror of
https://github.com/github/codeql.git
synced 2026-04-26 01:05:15 +02:00
C#: Improve arg-param mapping logic to consider named arguments passed to params parameters
This commit is contained in:
@@ -66,8 +66,7 @@ class Call extends DotNet::Call, Expr, @call {
|
||||
result = this.getImplicitArgument(p)
|
||||
or
|
||||
// Appears in the named part of the call
|
||||
result = this.getExplicitArgument(p.getName()) and
|
||||
(p.(Parameter).isParams() implies isValidExplicitParamsType(p, result.getType()))
|
||||
result = this.getExplicitArgument(p.getName())
|
||||
)
|
||||
}
|
||||
|
||||
@@ -224,28 +223,6 @@ class Call extends DotNet::Call, Expr, @call {
|
||||
override string toString() { result = "call" }
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the type `t` is a valid argument type for passing an explicit array
|
||||
* to the `params` parameter `p`. For example, the types `object[]` and `string[]`
|
||||
* of the arguments on lines 4 and 5, respectively, are valid for the parameter
|
||||
* `args` on line 1 in
|
||||
*
|
||||
* ```csharp
|
||||
* void M(params object[] args) { ... }
|
||||
*
|
||||
* void CallM(object[] os, string[] ss, string s) {
|
||||
* M(os);
|
||||
* M(ss);
|
||||
* M(s);
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate isValidExplicitParamsType(Parameter p, Type t) {
|
||||
p.isParams() and
|
||||
t.isImplicitlyConvertibleTo(p.getType())
|
||||
}
|
||||
|
||||
/**
|
||||
* A method call, for example `a.M()` on line 5 in
|
||||
*
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
| arguments.cs:35:9:35:19 | call to method f3 | arguments.cs:35:18:35:18 | 2 | args |
|
||||
| arguments.cs:36:9:36:33 | call to method f3 | arguments.cs:36:12:36:12 | 0 | o |
|
||||
| arguments.cs:36:9:36:33 | call to method f3 | arguments.cs:36:15:36:32 | array creation of type Int32[] | args |
|
||||
| arguments.cs:37:9:37:25 | call to method f3 | arguments.cs:37:18:37:18 | 1 | args |
|
||||
| arguments.cs:37:9:37:25 | call to method f3 | arguments.cs:37:24:37:24 | 0 | o |
|
||||
| arguments.cs:38:9:38:19 | call to method f3 | arguments.cs:38:12:38:12 | 0 | o |
|
||||
| arguments.cs:38:9:38:19 | call to method f3 | arguments.cs:38:15:38:18 | access to parameter args | args |
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
| arguments.cs:35:9:35:19 | call to method f3 | arguments.cs:35:18:35:18 | 2 | arguments.cs:33:33:33:36 | args |
|
||||
| arguments.cs:36:9:36:33 | call to method f3 | arguments.cs:36:12:36:12 | 0 | arguments.cs:33:17:33:17 | o |
|
||||
| arguments.cs:36:9:36:33 | call to method f3 | arguments.cs:36:15:36:32 | array creation of type Int32[] | arguments.cs:33:33:33:36 | args |
|
||||
| arguments.cs:37:9:37:25 | call to method f3 | arguments.cs:37:18:37:18 | 1 | arguments.cs:33:33:33:36 | args |
|
||||
| arguments.cs:37:9:37:25 | call to method f3 | arguments.cs:37:24:37:24 | 0 | arguments.cs:33:17:33:17 | o |
|
||||
| arguments.cs:38:9:38:19 | call to method f3 | arguments.cs:38:12:38:12 | 0 | arguments.cs:33:17:33:17 | o |
|
||||
| arguments.cs:38:9:38:19 | call to method f3 | arguments.cs:38:15:38:18 | access to parameter args | arguments.cs:33:33:33:36 | args |
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:35:15:35:15 | 1 |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:35:18:35:18 | 2 |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:36:15:36:32 | array creation of type Int32[] |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:37:18:37:18 | 1 |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:38:15:38:18 | access to parameter args |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:39:18:39:21 | access to parameter args |
|
||||
| arguments.cs:33:33:33:36 | args | arguments.cs:40:18:40:35 | array creation of type Int32[] |
|
||||
|
||||
Reference in New Issue
Block a user