Skip to content

Commit e106314

Browse files
committed
Rust: Fix type inference for library parameters
1 parent 55eb9fb commit e106314

File tree

5 files changed

+704
-20
lines changed

5 files changed

+704
-20
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ private module CallExprBaseMatchingInput implements MatchingInputSig {
608608
exists(Param p, int i |
609609
paramPos(this.getParamList(), p, i) and
610610
dpos = TPositionalDeclarationPosition(i) and
611-
result = inferAnnotatedType(p.getPat(), path)
611+
result = p.getTypeRepr().(TypeMention).resolveTypeAt(path)
612612
)
613613
or
614614
exists(SelfParam self |
@@ -1442,9 +1442,9 @@ private module Debug {
14421442
result = inferType(n, path)
14431443
}
14441444

1445-
Function debugResolveMethodCallExpr(MethodCallExpr mce) {
1446-
mce = getRelevantLocatable() and
1447-
result = resolveMethodCallTarget(mce)
1445+
Function debugResolveMethod(MethodCall mc) {
1446+
mc = getRelevantLocatable() and
1447+
result = resolveMethodCallTarget(mc)
14481448
}
14491449

14501450
pragma[nomagic]

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

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ models
66
| 5 | Summary: lang:core; <crate::option::Option>::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value |
77
| 6 | Summary: lang:core; <crate::pin::Pin>::into_inner; Argument[0].Field[core::pin::Pin::__pointer]; ReturnValue; value |
88
| 7 | Summary: lang:core; <crate::pin::Pin>::into_inner; Argument[0]; ReturnValue; value |
9-
| 8 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
10-
| 9 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue; value |
11-
| 10 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
12-
| 11 | Summary: lang:core; <i64 as crate::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
13-
| 12 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value |
14-
| 13 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value |
9+
| 8 | Summary: lang:core; <crate::pin::Pin>::into_inner_unchecked; Argument[0]; ReturnValue; value |
10+
| 9 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0].Reference; ReturnValue; value |
11+
| 10 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
12+
| 11 | Summary: lang:core; <crate::pin::Pin>::new; Argument[0]; ReturnValue; value |
13+
| 12 | Summary: lang:core; <crate::pin::Pin>::new_unchecked; Argument[0].Reference; ReturnValue; value |
14+
| 13 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
15+
| 14 | Summary: lang:core; <i64 as crate::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
16+
| 15 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value |
17+
| 16 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value |
1518
edges
1619
| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:4 |
1720
| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | |
@@ -20,18 +23,18 @@ edges
2023
| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:4 |
2124
| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | generated |
2225
| main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | |
23-
| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:10 |
26+
| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:13 |
2427
| main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | |
2528
| main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | |
2629
| main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | |
27-
| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:10 |
30+
| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:13 |
2831
| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | generated |
2932
| main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | |
3033
| main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | |
3134
| main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | |
3235
| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | |
3336
| main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | |
34-
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:11 |
37+
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:14 |
3538
| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | generated |
3639
| main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | |
3740
| main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:44:26:44:29 | self [Wrapper] | provenance | |
@@ -64,8 +67,8 @@ edges
6467
| main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | |
6568
| main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | |
6669
| main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | |
67-
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:13 |
68-
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:12 |
70+
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:16 |
71+
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:15 |
6972
| main.rs:108:13:108:17 | mut i | main.rs:109:34:109:34 | i | provenance | |
7073
| main.rs:108:13:108:17 | mut i | main.rs:110:33:110:33 | i | provenance | |
7174
| main.rs:108:13:108:17 | mut i | main.rs:111:47:111:47 | i | provenance | |
@@ -76,8 +79,8 @@ edges
7679
| main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | |
7780
| main.rs:109:24:109:35 | ...::new(...) [&ref] | main.rs:109:13:109:20 | mut pin1 [&ref] | provenance | |
7881
| main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | |
79-
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:9 |
80-
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:8 |
82+
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:11 |
83+
| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:10 |
8184
| main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | |
8285
| main.rs:110:13:110:20 | mut pin2 [&ref] | main.rs:116:15:116:18 | pin2 [&ref] | provenance | |
8386
| main.rs:110:24:110:34 | ...::pin(...) [&ref] | main.rs:110:13:110:20 | mut pin2 [&ref] | provenance | |
@@ -92,10 +95,26 @@ edges
9295
| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:6 |
9396
| main.rs:116:15:116:18 | pin2 [&ref] | main.rs:116:14:116:18 | * ... | provenance | |
9497
| main.rs:117:15:117:18 | pin3 [&ref] | main.rs:117:14:117:18 | * ... | provenance | |
98+
| main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | |
9599
| main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | |
96100
| main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | |
97101
| main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | |
102+
| main.rs:123:13:123:20 | mut pin1 [MyStruct] | main.rs:129:30:129:33 | pin1 [MyStruct] | provenance | |
103+
| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | main.rs:123:13:123:20 | mut pin1 [MyStruct] | provenance | |
104+
| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | provenance | MaD:9 |
105+
| main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | |
98106
| main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | |
107+
| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | |
108+
| main.rs:129:30:129:33 | pin1 [MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | provenance | MaD:7 |
109+
| main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | |
110+
| main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | |
111+
| main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | |
112+
| main.rs:137:13:137:20 | mut pin5 [MyStruct] | main.rs:139:40:139:43 | pin5 [MyStruct] | provenance | |
113+
| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | main.rs:137:13:137:20 | mut pin5 [MyStruct] | provenance | |
114+
| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | provenance | MaD:12 |
115+
| main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | |
116+
| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | |
117+
| main.rs:139:40:139:43 | pin5 [MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | provenance | MaD:8 |
99118
nodes
100119
| main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] |
101120
| main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] |
@@ -183,8 +202,25 @@ nodes
183202
| main.rs:122:13:122:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] |
184203
| main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] |
185204
| main.rs:122:38:122:47 | source(...) | semmle.label | source(...) |
205+
| main.rs:123:13:123:20 | mut pin1 [MyStruct] | semmle.label | mut pin1 [MyStruct] |
206+
| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | semmle.label | ...::new(...) [MyStruct] |
207+
| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] |
208+
| main.rs:123:34:123:35 | ms [MyStruct] | semmle.label | ms [MyStruct] |
186209
| main.rs:127:14:127:15 | ms [MyStruct] | semmle.label | ms [MyStruct] |
187210
| main.rs:127:14:127:19 | ms.val | semmle.label | ms.val |
211+
| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | semmle.label | ...::into_inner(...) [MyStruct] |
212+
| main.rs:129:14:129:38 | ... .val | semmle.label | ... .val |
213+
| main.rs:129:30:129:33 | pin1 [MyStruct] | semmle.label | pin1 [MyStruct] |
214+
| main.rs:136:13:136:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] |
215+
| main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] |
216+
| main.rs:136:38:136:47 | source(...) | semmle.label | source(...) |
217+
| main.rs:137:13:137:20 | mut pin5 [MyStruct] | semmle.label | mut pin5 [MyStruct] |
218+
| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | semmle.label | ...::new_unchecked(...) [MyStruct] |
219+
| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] |
220+
| main.rs:137:44:137:45 | ms [MyStruct] | semmle.label | ms [MyStruct] |
221+
| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | semmle.label | ...::into_inner_unchecked(...) [MyStruct] |
222+
| main.rs:139:14:139:48 | ... .val | semmle.label | ... .val |
223+
| main.rs:139:40:139:43 | pin5 [MyStruct] | semmle.label | pin5 [MyStruct] |
188224
subpaths
189225
| 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] |
190226
testFailures
@@ -205,3 +241,5 @@ testFailures
205241
| 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(...) |
206242
| 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(...) |
207243
| 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(...) |
244+
| 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(...) |
245+
| 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: 3 additions & 3 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 {
@@ -126,7 +126,7 @@ fn test_pin() {
126126
let mut pin4 = pin!(&ms);
127127
sink(ms.val); // $ hasValueFlow=41
128128
sink(pin1.val); // $ MISSING: hasValueFlow=41
129-
sink(Pin::into_inner(pin1).val); // $ MISSING: hasValueFlow=41
129+
sink(Pin::into_inner(pin1).val); // $ hasValueFlow=41
130130
sink(pin2.val); // $ MISSING: hasValueFlow=41
131131
sink(pin3.val); // $ MISSING: hasValueFlow=41
132132
sink(pin4.val); // $ MISSING: hasValueFlow=41
@@ -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)