Skip to content

Commit 6e99087

Browse files
committed
Rust: Basic support for futures and await
1 parent a40cfeb commit 6e99087

File tree

4 files changed

+76
-26
lines changed

4 files changed

+76
-26
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,15 @@ final class ElementContent extends Content, TElementContent {
853853
override Location getLocation() { result instanceof EmptyLocation }
854854
}
855855

856+
/**
857+
* A value that a future resolves to.
858+
*/
859+
final class FutureContent extends Content, TFutureContent {
860+
override string toString() { result = "future" }
861+
862+
override Location getLocation() { result instanceof EmptyLocation }
863+
}
864+
856865
/**
857866
* Content stored at a position in a tuple.
858867
*
@@ -1229,6 +1238,12 @@ module RustDataFlow implements InputSig<Location> {
12291238
c instanceof FunctionCallReturnContent
12301239
)
12311240
or
1241+
exists(AwaitExprCfgNode await |
1242+
c instanceof FutureContent and
1243+
node1.asExpr() = await.getExpr() and
1244+
node2.asExpr() = await
1245+
)
1246+
or
12321247
VariableCapture::readStep(node1, c, node2)
12331248
)
12341249
or
@@ -1593,7 +1608,8 @@ private module Cached {
15931608
[
15941609
any(IndexExprCfgNode i).getBase(), any(FieldExprCfgNode access).getExpr(),
15951610
any(TryExprCfgNode try).getExpr(),
1596-
any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr()
1611+
any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr(),
1612+
any(AwaitExprCfgNode a).getExpr()
15971613
]
15981614
} or
15991615
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or
@@ -1649,6 +1665,7 @@ private module Cached {
16491665
TVariantInLibTupleFieldContent(VariantInLib::VariantInLib v, int pos) { pos = v.getAPosition() } or
16501666
TVariantRecordFieldContent(Variant v, string field) { exists(getVariantRecordField(v, field)) } or
16511667
TElementContent() or
1668+
TFutureContent() or
16521669
TTuplePositionContent(int pos) {
16531670
pos in [0 .. max([
16541671
any(TuplePat pat).getNumberOfFields(),

rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ module Input implements InputSig<Location, RustDataFlow> {
9797
c = TTuplePositionContent(pos) and
9898
arg = pos.toString()
9999
)
100+
or
101+
result = "Future" and
102+
c = TFutureContent() and
103+
arg = ""
100104
)
101105
}
102106

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ async fn get_async_number(a: i64) -> i64 {
210210
async fn test_get_async_number() {
211211
let s = source(46);
212212
let t = get_async_number(s).await;
213-
sink(t); // $ MISSING: hasValueFlow=46
213+
sink(t); // $ hasValueFlow=46
214214
}
215215

216216
impl MyFieldEnum {

rust/ql/test/library-tests/dataflow/models/models.expected

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ models
99
| 8 | Summary: repo::test; crate::apply; Argument[1].ReturnValue; ReturnValue; value |
1010
| 9 | Summary: repo::test; crate::coerce; Argument[0]; ReturnValue; taint |
1111
| 10 | Summary: repo::test; crate::get_array_element; Argument[0].Element; ReturnValue; value |
12-
| 11 | Summary: repo::test; crate::get_struct_field; Argument[0].Struct[crate::MyStruct::field1]; ReturnValue; value |
13-
| 12 | Summary: repo::test; crate::get_tuple_element; Argument[0].Tuple[0]; ReturnValue; value |
14-
| 13 | Summary: repo::test; crate::get_var_field; Argument[0].Variant[crate::MyFieldEnum::C::field_c]; ReturnValue; value |
15-
| 14 | Summary: repo::test; crate::get_var_pos; Argument[0].Variant[crate::MyPosEnum::A(0)]; ReturnValue; value |
16-
| 15 | Summary: repo::test; crate::set_array_element; Argument[0]; ReturnValue.Element; value |
17-
| 16 | Summary: repo::test; crate::set_tuple_element; Argument[0]; ReturnValue.Tuple[1]; value |
18-
| 17 | Summary: repo::test; crate::set_var_field; Argument[0]; ReturnValue.Variant[crate::MyFieldEnum::D::field_d]; value |
19-
| 18 | Summary: repo::test; crate::set_var_pos; Argument[0]; ReturnValue.Variant[crate::MyPosEnum::B(0)]; value |
12+
| 11 | Summary: repo::test; crate::get_async_number; Argument[0]; ReturnValue.Future; value |
13+
| 12 | Summary: repo::test; crate::get_struct_field; Argument[0].Struct[crate::MyStruct::field1]; ReturnValue; value |
14+
| 13 | Summary: repo::test; crate::get_tuple_element; Argument[0].Tuple[0]; ReturnValue; value |
15+
| 14 | Summary: repo::test; crate::get_var_field; Argument[0].Variant[crate::MyFieldEnum::C::field_c]; ReturnValue; value |
16+
| 15 | Summary: repo::test; crate::get_var_pos; Argument[0].Variant[crate::MyPosEnum::A(0)]; ReturnValue; value |
17+
| 16 | Summary: repo::test; crate::set_array_element; Argument[0]; ReturnValue.Element; value |
18+
| 17 | Summary: repo::test; crate::set_tuple_element; Argument[0]; ReturnValue.Tuple[1]; value |
19+
| 18 | Summary: repo::test; crate::set_var_field; Argument[0]; ReturnValue.Variant[crate::MyFieldEnum::D::field_d]; value |
20+
| 19 | Summary: repo::test; crate::set_var_pos; Argument[0]; ReturnValue.Variant[crate::MyPosEnum::B(0)]; value |
2021
edges
2122
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
2223
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
@@ -37,8 +38,8 @@ edges
3738
| main.rs:41:14:41:28 | ...::A(...) [A] | main.rs:41:9:41:10 | e1 [A] | provenance | |
3839
| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | |
3940
| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | |
40-
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:14 |
41-
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:14 |
41+
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:15 |
42+
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:15 |
4243
| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | |
4344
| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | |
4445
| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | |
@@ -47,8 +48,8 @@ edges
4748
| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | |
4849
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
4950
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
50-
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:18 |
51-
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:18 |
51+
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:19 |
52+
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:19 |
5253
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
5354
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
5455
| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | |
@@ -65,8 +66,8 @@ edges
6566
| main.rs:73:14:73:42 | ...::C {...} [C] | main.rs:73:9:73:10 | e1 [C] | provenance | |
6667
| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | |
6768
| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | |
68-
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:13 |
69-
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:13 |
69+
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:14 |
70+
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:14 |
7071
| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | |
7172
| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | |
7273
| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | |
@@ -75,8 +76,8 @@ edges
7576
| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | |
7677
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
7778
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
78-
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:17 |
79-
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:17 |
79+
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:18 |
80+
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:18 |
8081
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
8182
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
8283
| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | |
@@ -93,8 +94,8 @@ edges
9394
| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | main.rs:105:9:105:17 | my_struct [MyStruct.field1] | provenance | |
9495
| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | |
9596
| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | |
96-
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:11 |
97-
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:11 |
97+
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:12 |
98+
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:12 |
9899
| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | |
99100
| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | |
100101
| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | |
@@ -111,8 +112,8 @@ edges
111112
| main.rs:149:9:149:11 | arr [element] | main.rs:150:10:150:12 | arr [element] | provenance | |
112113
| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | |
113114
| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | |
114-
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:15 |
115-
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:15 |
115+
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:16 |
116+
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:16 |
116117
| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | |
117118
| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | |
118119
| main.rs:159:9:159:9 | s | main.rs:160:14:160:14 | s | provenance | |
@@ -125,8 +126,8 @@ edges
125126
| main.rs:160:13:160:18 | TupleExpr [tuple.0] | main.rs:160:9:160:9 | t [tuple.0] | provenance | |
126127
| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | |
127128
| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | |
128-
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:12 |
129-
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:12 |
129+
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:13 |
130+
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:13 |
130131
| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | |
131132
| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | |
132133
| main.rs:172:13:172:22 | source(...) | main.rs:172:9:172:9 | s | provenance | |
@@ -135,8 +136,8 @@ edges
135136
| main.rs:173:9:173:9 | t [tuple.1] | main.rs:175:10:175:10 | t [tuple.1] | provenance | |
136137
| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | |
137138
| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | |
138-
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:16 |
139-
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:16 |
139+
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:17 |
140+
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:17 |
140141
| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | |
141142
| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | |
142143
| main.rs:184:9:184:9 | s | main.rs:189:11:189:11 | s | provenance | |
@@ -177,6 +178,18 @@ edges
177178
| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | provenance | MaD:7 |
178179
| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:7 |
179180
| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:7 |
181+
| main.rs:211:9:211:9 | s | main.rs:212:30:212:30 | s | provenance | |
182+
| main.rs:211:9:211:9 | s | main.rs:212:30:212:30 | s | provenance | |
183+
| main.rs:211:13:211:22 | source(...) | main.rs:211:9:211:9 | s | provenance | |
184+
| main.rs:211:13:211:22 | source(...) | main.rs:211:9:211:9 | s | provenance | |
185+
| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | |
186+
| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | |
187+
| main.rs:212:13:212:31 | get_async_number(...) [future] | main.rs:212:13:212:37 | await ... | provenance | |
188+
| main.rs:212:13:212:31 | get_async_number(...) [future] | main.rs:212:13:212:37 | await ... | provenance | |
189+
| main.rs:212:13:212:37 | await ... | main.rs:212:9:212:9 | t | provenance | |
190+
| main.rs:212:13:212:37 | await ... | main.rs:212:9:212:9 | t | provenance | |
191+
| main.rs:212:30:212:30 | s | main.rs:212:13:212:31 | get_async_number(...) [future] | provenance | MaD:11 |
192+
| main.rs:212:30:212:30 | s | main.rs:212:13:212:31 | get_async_number(...) [future] | provenance | MaD:11 |
180193
| main.rs:232:9:232:9 | s [D] | main.rs:233:11:233:11 | s [D] | provenance | |
181194
| main.rs:232:9:232:9 | s [D] | main.rs:233:11:233:11 | s [D] | provenance | |
182195
| main.rs:232:13:232:23 | enum_source | main.rs:232:13:232:27 | enum_source(...) [D] | provenance | Src:MaD:5 |
@@ -416,6 +429,20 @@ nodes
416429
| main.rs:202:19:202:19 | s | semmle.label | s |
417430
| main.rs:203:10:203:10 | t | semmle.label | t |
418431
| main.rs:203:10:203:10 | t | semmle.label | t |
432+
| main.rs:211:9:211:9 | s | semmle.label | s |
433+
| main.rs:211:9:211:9 | s | semmle.label | s |
434+
| main.rs:211:13:211:22 | source(...) | semmle.label | source(...) |
435+
| main.rs:211:13:211:22 | source(...) | semmle.label | source(...) |
436+
| main.rs:212:9:212:9 | t | semmle.label | t |
437+
| main.rs:212:9:212:9 | t | semmle.label | t |
438+
| main.rs:212:13:212:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] |
439+
| main.rs:212:13:212:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] |
440+
| main.rs:212:13:212:37 | await ... | semmle.label | await ... |
441+
| main.rs:212:13:212:37 | await ... | semmle.label | await ... |
442+
| main.rs:212:30:212:30 | s | semmle.label | s |
443+
| main.rs:212:30:212:30 | s | semmle.label | s |
444+
| main.rs:213:10:213:10 | t | semmle.label | t |
445+
| main.rs:213:10:213:10 | t | semmle.label | t |
419446
| main.rs:232:9:232:9 | s [D] | semmle.label | s [D] |
420447
| main.rs:232:9:232:9 | s [D] | semmle.label | s [D] |
421448
| main.rs:232:13:232:23 | enum_source | semmle.label | enum_source |
@@ -519,6 +546,8 @@ invalidSpecComponent
519546
| main.rs:196:10:196:10 | t | main.rs:193:13:193:22 | source(...) | main.rs:196:10:196:10 | t | $@ | main.rs:193:13:193:22 | source(...) | source(...) |
520547
| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) |
521548
| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) |
549+
| main.rs:213:10:213:10 | t | main.rs:211:13:211:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:211:13:211:22 | source(...) | source(...) |
550+
| main.rs:213:10:213:10 | t | main.rs:211:13:211:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:211:13:211:22 | source(...) | source(...) |
522551
| main.rs:235:47:235:47 | i | main.rs:232:13:232:23 | enum_source | main.rs:235:47:235:47 | i | $@ | main.rs:232:13:232:23 | enum_source | enum_source |
523552
| main.rs:235:47:235:47 | i | main.rs:232:13:232:23 | enum_source | main.rs:235:47:235:47 | i | $@ | main.rs:232:13:232:23 | enum_source | enum_source |
524553
| main.rs:243:47:243:47 | i | main.rs:241:15:241:20 | source | main.rs:243:47:243:47 | i | $@ | main.rs:241:15:241:20 | source | source |

0 commit comments

Comments
 (0)