Skip to content

Commit 3aeb1b5

Browse files
committed
Rust: Fix type inference for library parameters
1 parent ffbc59c commit 3aeb1b5

File tree

4 files changed

+697
-17
lines changed

4 files changed

+697
-17
lines changed

rust/ql/lib/codeql/rust/internal/TypeInference.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ private module CallExprBaseMatchingInput implements MatchingInputSig {
609609
exists(Param p, int i, boolean inMethod |
610610
paramPos(this.getParamList(), p, i, inMethod) and
611611
dpos = TPositionalDeclarationPosition(i, inMethod) and
612-
result = inferAnnotatedType(p.getPat(), path)
612+
result = p.getTypeRepr().(TypeMention).resolveTypeAt(path)
613613
)
614614
or
615615
exists(SelfParam self |
@@ -1587,9 +1587,9 @@ private module Debug {
15871587
result = inferType(n, path)
15881588
}
15891589

1590-
Function debugResolveMethodCallExpr(MethodCallExpr mce) {
1591-
mce = getRelevantLocatable() and
1592-
result = resolveMethodCallTarget(mce)
1590+
Function debugResolveMethod(MethodCall mc) {
1591+
mc = getRelevantLocatable() and
1592+
result = resolveMethodCallTarget(mc)
15931593
}
15941594

15951595
pragma[nomagic]

rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ models
55
| 4 | Summary: lang:core; <crate::option::Option>::unwrap; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
66
| 5 | Summary: lang:core; <crate::option::Option>::zip; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[1]; value |
77
| 6 | Summary: lang:core; <crate::pin::Pin>::into_inner; Argument[0]; ReturnValue; value |
8-
| 7 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue; value |
9-
| 8 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
10-
| 9 | Summary: lang:core; <i64 as crate::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
11-
| 10 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value |
12-
| 11 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value |
8+
| 7 | Summary: lang:core; <crate::pin::Pin>::into_inner_unchecked; Argument[0]; ReturnValue; value |
9+
| 8 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0].Reference; ReturnValue; value |
10+
| 9 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue; value |
11+
| 10 | Summary: lang:core; <crate::pin::Pin>::new_unchecked; Argument[0].Reference; ReturnValue; value |
12+
| 11 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |
13+
| 12 | Summary: lang:core; <i64 as crate::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
14+
| 13 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value |
15+
| 14 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value |
1316
edges
1417
| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:4 |
1518
| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | |
@@ -18,18 +21,18 @@ edges
1821
| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:4 |
1922
| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | generated |
2023
| main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | |
21-
| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:8 |
24+
| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:11 |
2225
| main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | |
2326
| main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | |
2427
| main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | |
25-
| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:8 |
28+
| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:11 |
2629
| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | generated |
2730
| main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | |
2831
| main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | |
2932
| main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | |
3033
| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | |
3134
| main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | |
32-
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:9 |
35+
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:12 |
3336
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | generated |
3437
| main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | |
3538
| main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:44:26:44:29 | self [Wrapper] | provenance | |
@@ -62,8 +65,8 @@ edges
6265
| main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | |
6366
| main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | |
6467
| main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | |
65-
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:11 |
66-
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:10 |
68+
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:14 |
69+
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:13 |
6770
| main.rs:108:13:108:17 | mut i | main.rs:109:34:109:34 | i | provenance | |
6871
| main.rs:108:13:108:17 | mut i | main.rs:110:33:110:33 | i | provenance | |
6972
| main.rs:108:13:108:17 | mut i | main.rs:111:47:111:47 | i | provenance | |
@@ -72,7 +75,7 @@ edges
7275
| main.rs:109:13:109:20 | mut pin1 [&ref] | main.rs:114:15:114:18 | pin1 [&ref] | provenance | |
7376
| main.rs:109:13:109:20 | mut pin1 [&ref] | main.rs:115:31:115:34 | pin1 [&ref] | provenance | |
7477
| main.rs:109:24:109:35 | ...::new(...) [&ref] | main.rs:109:13:109:20 | mut pin1 [&ref] | provenance | |
75-
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:7 |
78+
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:9 |
7679
| main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | |
7780
| main.rs:110:13:110:20 | mut pin2 [&ref] | main.rs:116:15:116:18 | pin2 [&ref] | provenance | |
7881
| main.rs:110:24:110:34 | ...::pin(...) [&ref] | main.rs:110:13:110:20 | mut pin2 [&ref] | provenance | |
@@ -86,10 +89,26 @@ edges
8689
| main.rs:115:31:115:34 | pin1 [&ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:6 |
8790
| main.rs:116:15:116:18 | pin2 [&ref] | main.rs:116:14:116:18 | * ... | provenance | |
8891
| main.rs:117:15:117:18 | pin3 [&ref] | main.rs:117:14:117:18 | * ... | provenance | |
92+
| main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | |
8993
| main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | |
9094
| main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | |
9195
| main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | |
96+
| main.rs:123:13:123:20 | mut pin1 [MyStruct] | main.rs:129:30:129:33 | pin1 [MyStruct] | provenance | |
97+
| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | main.rs:123:13:123:20 | mut pin1 [MyStruct] | provenance | |
98+
| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | provenance | MaD:8 |
99+
| main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | |
92100
| main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | |
101+
| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | |
102+
| main.rs:129:30:129:33 | pin1 [MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | provenance | MaD:6 |
103+
| main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | |
104+
| main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | |
105+
| main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | |
106+
| main.rs:137:13:137:20 | mut pin5 [MyStruct] | main.rs:139:40:139:43 | pin5 [MyStruct] | provenance | |
107+
| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | main.rs:137:13:137:20 | mut pin5 [MyStruct] | provenance | |
108+
| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | provenance | MaD:10 |
109+
| main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | |
110+
| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | |
111+
| main.rs:139:40:139:43 | pin5 [MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | provenance | MaD:7 |
93112
nodes
94113
| main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] |
95114
| main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] |
@@ -174,11 +193,29 @@ nodes
174193
| main.rs:122:13:122:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] |
175194
| main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] |
176195
| main.rs:122:38:122:47 | source(...) | semmle.label | source(...) |
196+
| main.rs:123:13:123:20 | mut pin1 [MyStruct] | semmle.label | mut pin1 [MyStruct] |
197+
| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | semmle.label | ...::new(...) [MyStruct] |
198+
| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] |
199+
| main.rs:123:34:123:35 | ms [MyStruct] | semmle.label | ms [MyStruct] |
177200
| main.rs:127:14:127:15 | ms [MyStruct] | semmle.label | ms [MyStruct] |
178201
| main.rs:127:14:127:19 | ms.val | semmle.label | ms.val |
202+
| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | semmle.label | ...::into_inner(...) [MyStruct] |
203+
| main.rs:129:14:129:38 | ... .val | semmle.label | ... .val |
204+
| main.rs:129:30:129:33 | pin1 [MyStruct] | semmle.label | pin1 [MyStruct] |
205+
| main.rs:136:13:136:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] |
206+
| main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] |
207+
| main.rs:136:38:136:47 | source(...) | semmle.label | source(...) |
208+
| main.rs:137:13:137:20 | mut pin5 [MyStruct] | semmle.label | mut pin5 [MyStruct] |
209+
| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | semmle.label | ...::new_unchecked(...) [MyStruct] |
210+
| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] |
211+
| main.rs:137:44:137:45 | ms [MyStruct] | semmle.label | ms [MyStruct] |
212+
| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | semmle.label | ...::into_inner_unchecked(...) [MyStruct] |
213+
| main.rs:139:14:139:48 | ... .val | semmle.label | ... .val |
214+
| main.rs:139:40:139:43 | pin5 [MyStruct] | semmle.label | pin5 [MyStruct] |
179215
subpaths
180216
| main.rs:50:15:50:15 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:43:33:45:9 | { ... } [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] |
181217
testFailures
218+
| main.rs:129:14:129:38 | ... .val | Fixed missing result: hasValueFlow=41 |
182219
#select
183220
| main.rs:13:10:13:19 | a.unwrap() | main.rs:12:18:12:27 | source(...) | main.rs:13:10:13:19 | a.unwrap() | $@ | main.rs:12:18:12:27 | source(...) | source(...) |
184221
| main.rs:15:10:15:19 | b.unwrap() | main.rs:12:18:12:27 | source(...) | main.rs:15:10:15:19 | b.unwrap() | $@ | main.rs:12:18:12:27 | source(...) | source(...) |
@@ -196,3 +233,5 @@ testFailures
196233
| main.rs:116:14:116:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:116:14:116:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) |
197234
| main.rs:117:14:117:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:117:14:117:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) |
198235
| main.rs:127:14:127:19 | ms.val | main.rs:122:38:122:47 | source(...) | main.rs:127:14:127:19 | ms.val | $@ | main.rs:122:38:122:47 | source(...) | source(...) |
236+
| main.rs:129:14:129:38 | ... .val | main.rs:122:38:122:47 | source(...) | main.rs:129:14:129:38 | ... .val | $@ | main.rs:122:38:122:47 | source(...) | source(...) |
237+
| main.rs:139:14:139:48 | ... .val | main.rs:136:38:136:47 | source(...) | main.rs:139:14:139:48 | ... .val | $@ | main.rs:136:38:136:47 | source(...) | source(...) |

rust/ql/test/library-tests/dataflow/modeled/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ mod ptr {
9595
}
9696
}
9797

98-
use std::pin::Pin;
9998
use std::pin::pin;
99+
use std::pin::Pin;
100100

101101
#[derive(Clone)]
102102
struct MyStruct {
@@ -136,7 +136,7 @@ fn test_pin() {
136136
let mut ms = MyStruct { val: source(42) };
137137
let mut pin5 = Pin::new_unchecked(&ms);
138138
sink(pin5.val); // $ MISSING: hasValueFlow=42
139-
sink(Pin::into_inner_unchecked(pin5).val); // $ MISSING: hasValueFlow=42
139+
sink(Pin::into_inner_unchecked(pin5).val); // $ hasValueFlow=42
140140
}
141141

142142
{

0 commit comments

Comments
 (0)