Skip to content

Commit aa43d50

Browse files
authored
Merge pull request #18671 from geoffw0/http
Rust: Model some sources for HTTP
2 parents 9054f16 + d0e0a7b commit aa43d50

File tree

12 files changed

+1370
-1111
lines changed

12 files changed

+1370
-1111
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/rust-all
4+
extensible: sourceModel
5+
data:
6+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::conn::http1::SendRequest>::send_request", "ReturnValue.Future.Variant[crate::result::Result::Ok(0)]", "remote", "manual"]
7+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::conn::http2::SendRequest>::send_request", "ReturnValue.Future.Variant[crate::result::Result::Ok(0)]", "remote", "manual"]
8+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::conn::http1::SendRequest>::try_send_request", "ReturnValue.Future.Variant[crate::result::Result::Ok(0)]", "remote", "manual"]
9+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::conn::http2::SendRequest>::try_send_request", "ReturnValue.Future.Variant[crate::result::Result::Ok(0)]", "remote", "manual"]
10+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::Client>::get", "ReturnValue.Future", "remote", "manual"]
11+
- ["repo:https://github.com/hyperium/hyper:hyper", "<crate::client::Client>::request", "ReturnValue.Future", "remote", "manual"]
12+
- ["repo:https://github.com/hyperium/hyper-util:hyper-util", "<crate::client::legacy::Client>::get", "ReturnValue.Future", "remote", "manual"]
13+
- ["repo:https://github.com/hyperium/hyper-util:hyper-util", "<crate::client::legacy::Client>::request", "ReturnValue.Future", "remote", "manual"]

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

+29-17
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,17 @@ edges
4242
| main.rs:101:13:101:30 | mn.data_through(...) | main.rs:101:9:101:9 | b | provenance | |
4343
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | provenance | |
4444
| main.rs:101:29:101:29 | a | main.rs:101:13:101:30 | mn.data_through(...) | provenance | |
45-
| main.rs:139:25:139:30 | ...: i64 | main.rs:140:10:140:10 | c | provenance | |
46-
| main.rs:140:6:140:6 | [post] n [&ref] | main.rs:139:12:139:22 | ...: ... [Return] [&ref] | provenance | |
47-
| main.rs:140:10:140:10 | c | main.rs:140:6:140:6 | [post] n [&ref] | provenance | |
48-
| main.rs:148:13:148:13 | [post] m [&ref] | main.rs:149:11:149:11 | m [&ref] | provenance | |
49-
| main.rs:148:16:148:25 | source(...) | main.rs:139:25:139:30 | ...: i64 | provenance | |
50-
| main.rs:148:16:148:25 | source(...) | main.rs:148:13:148:13 | [post] m [&ref] | provenance | |
51-
| main.rs:149:11:149:11 | m [&ref] | main.rs:149:10:149:11 | * ... | provenance | |
45+
| main.rs:138:9:138:9 | a | main.rs:139:10:139:10 | a | provenance | |
46+
| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | a | provenance | |
47+
| main.rs:148:13:148:13 | c | main.rs:149:14:149:14 | c | provenance | |
48+
| main.rs:148:17:148:25 | source(...) | main.rs:148:13:148:13 | c | provenance | |
49+
| main.rs:164:25:164:30 | ...: i64 | main.rs:165:10:165:10 | c | provenance | |
50+
| main.rs:165:6:165:6 | [post] n [&ref] | main.rs:164:12:164:22 | ...: ... [Return] [&ref] | provenance | |
51+
| main.rs:165:10:165:10 | c | main.rs:165:6:165:6 | [post] n [&ref] | provenance | |
52+
| main.rs:173:13:173:13 | [post] m [&ref] | main.rs:174:11:174:11 | m [&ref] | provenance | |
53+
| main.rs:173:16:173:25 | source(...) | main.rs:164:25:164:30 | ...: i64 | provenance | |
54+
| main.rs:173:16:173:25 | source(...) | main.rs:173:13:173:13 | [post] m [&ref] | provenance | |
55+
| main.rs:174:11:174:11 | m [&ref] | main.rs:174:10:174:11 | * ... | provenance | |
5256
nodes
5357
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
5458
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
@@ -99,20 +103,26 @@ nodes
99103
| main.rs:101:13:101:30 | mn.data_through(...) | semmle.label | mn.data_through(...) |
100104
| main.rs:101:29:101:29 | a | semmle.label | a |
101105
| main.rs:102:10:102:10 | b | semmle.label | b |
102-
| main.rs:139:12:139:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] |
103-
| main.rs:139:25:139:30 | ...: i64 | semmle.label | ...: i64 |
104-
| main.rs:140:6:140:6 | [post] n [&ref] | semmle.label | [post] n [&ref] |
105-
| main.rs:140:10:140:10 | c | semmle.label | c |
106-
| main.rs:148:13:148:13 | [post] m [&ref] | semmle.label | [post] m [&ref] |
107-
| main.rs:148:16:148:25 | source(...) | semmle.label | source(...) |
108-
| main.rs:149:10:149:11 | * ... | semmle.label | * ... |
109-
| main.rs:149:11:149:11 | m [&ref] | semmle.label | m [&ref] |
106+
| main.rs:138:9:138:9 | a | semmle.label | a |
107+
| main.rs:138:13:138:21 | source(...) | semmle.label | source(...) |
108+
| main.rs:139:10:139:10 | a | semmle.label | a |
109+
| main.rs:148:13:148:13 | c | semmle.label | c |
110+
| main.rs:148:17:148:25 | source(...) | semmle.label | source(...) |
111+
| main.rs:149:14:149:14 | c | semmle.label | c |
112+
| main.rs:164:12:164:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] |
113+
| main.rs:164:25:164:30 | ...: i64 | semmle.label | ...: i64 |
114+
| main.rs:165:6:165:6 | [post] n [&ref] | semmle.label | [post] n [&ref] |
115+
| main.rs:165:10:165:10 | c | semmle.label | c |
116+
| main.rs:173:13:173:13 | [post] m [&ref] | semmle.label | [post] m [&ref] |
117+
| main.rs:173:16:173:25 | source(...) | semmle.label | source(...) |
118+
| main.rs:174:10:174:11 | * ... | semmle.label | * ... |
119+
| main.rs:174:11:174:11 | m [&ref] | semmle.label | m [&ref] |
110120
subpaths
111121
| main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) |
112122
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) |
113123
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) |
114124
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | main.rs:101:13:101:30 | mn.data_through(...) |
115-
| main.rs:148:16:148:25 | source(...) | main.rs:139:25:139:30 | ...: i64 | main.rs:139:12:139:22 | ...: ... [Return] [&ref] | main.rs:148:13:148:13 | [post] m [&ref] |
125+
| main.rs:173:16:173:25 | source(...) | main.rs:164:25:164:30 | ...: i64 | main.rs:164:12:164:22 | ...: ... [Return] [&ref] | main.rs:173:13:173:13 | [post] m [&ref] |
116126
testFailures
117127
#select
118128
| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) |
@@ -123,4 +133,6 @@ testFailures
123133
| main.rs:68:14:68:14 | n | main.rs:94:13:94:21 | source(...) | main.rs:68:14:68:14 | n | $@ | main.rs:94:13:94:21 | source(...) | source(...) |
124134
| main.rs:89:10:89:10 | a | main.rs:74:13:74:21 | source(...) | main.rs:89:10:89:10 | a | $@ | main.rs:74:13:74:21 | source(...) | source(...) |
125135
| main.rs:102:10:102:10 | b | main.rs:100:13:100:21 | source(...) | main.rs:102:10:102:10 | b | $@ | main.rs:100:13:100:21 | source(...) | source(...) |
126-
| main.rs:149:10:149:11 | * ... | main.rs:148:16:148:25 | source(...) | main.rs:149:10:149:11 | * ... | $@ | main.rs:148:16:148:25 | source(...) | source(...) |
136+
| main.rs:139:10:139:10 | a | main.rs:138:13:138:21 | source(...) | main.rs:139:10:139:10 | a | $@ | main.rs:138:13:138:21 | source(...) | source(...) |
137+
| main.rs:149:14:149:14 | c | main.rs:148:17:148:25 | source(...) | main.rs:149:14:149:14 | c | $@ | main.rs:148:17:148:25 | source(...) | source(...) |
138+
| main.rs:174:10:174:11 | * ... | main.rs:173:16:173:25 | source(...) | main.rs:174:10:174:11 | * ... | $@ | main.rs:173:16:173:25 | source(...) | source(...) |

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

+26
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,31 @@ pub fn test_operator_overloading() {
134134
sink(d.value); // $ MISSING: hasValueFlow=7
135135
}
136136

137+
async fn async_source() -> i64 {
138+
let a = source(1);
139+
sink(a); // $ hasValueFlow=1
140+
a
141+
}
142+
143+
async fn test_async_await_async_part() {
144+
let a = async_source().await;
145+
sink(a); // $ MISSING: hasValueFlow=1
146+
147+
let b = async {
148+
let c = source(2);
149+
sink(c); // $ hasValueFlow=2
150+
c
151+
};
152+
sink(b.await); // $ MISSING: hasValueFlow=2
153+
}
154+
155+
fn test_async_await() {
156+
let a = futures::executor::block_on(async_source());
157+
sink(a); // $ MISSING: hasValueFlow=1
158+
159+
futures::executor::block_on(test_async_await_async_part());
160+
}
161+
137162
// Flow out of mutable parameters.
138163

139164
fn set_int(n: &mut i64, c: i64) {
@@ -168,6 +193,7 @@ fn main() {
168193
data_through_method();
169194

170195
test_operator_overloading();
196+
test_async_await();
171197
mutates_argument_1();
172198
mutates_argument_2();
173199
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
qltest_cargo_check: true
2+
qltest_dependencies:
3+
- futures = { version = "0.3" }

rust/ql/test/library-tests/dataflow/global/viableCallable.expected

+28-17
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,32 @@
2929
| main.rs:131:28:131:36 | source(...) | main.rs:1:1:3:1 | fn source |
3030
| main.rs:133:13:133:20 | a.add(...) | main.rs:114:5:117:5 | fn add |
3131
| main.rs:134:5:134:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
32-
| main.rs:147:5:147:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
33-
| main.rs:148:5:148:26 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
34-
| main.rs:148:16:148:25 | source(...) | main.rs:1:1:3:1 | fn source |
35-
| main.rs:149:5:149:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
36-
| main.rs:155:5:155:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
37-
| main.rs:156:5:156:31 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
38-
| main.rs:156:21:156:30 | source(...) | main.rs:1:1:3:1 | fn source |
32+
| main.rs:138:13:138:21 | source(...) | main.rs:1:1:3:1 | fn source |
33+
| main.rs:139:5:139:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
34+
| main.rs:144:13:144:26 | async_source(...) | main.rs:137:1:141:1 | fn async_source |
35+
| main.rs:145:5:145:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
36+
| main.rs:148:17:148:25 | source(...) | main.rs:1:1:3:1 | fn source |
37+
| main.rs:149:9:149:15 | sink(...) | main.rs:5:1:7:1 | fn sink |
38+
| main.rs:152:5:152:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
39+
| main.rs:156:41:156:54 | async_source(...) | main.rs:137:1:141:1 | fn async_source |
3940
| main.rs:157:5:157:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
40-
| main.rs:161:5:161:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
41-
| main.rs:162:5:162:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
42-
| main.rs:163:5:163:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
43-
| main.rs:164:5:164:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
44-
| main.rs:166:5:166:24 | data_out_of_method(...) | main.rs:86:1:90:1 | fn data_out_of_method |
45-
| main.rs:167:5:167:28 | data_in_to_method_call(...) | main.rs:92:1:96:1 | fn data_in_to_method_call |
46-
| main.rs:168:5:168:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
47-
| main.rs:170:5:170:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
48-
| main.rs:171:5:171:24 | mutates_argument_1(...) | main.rs:143:1:150:1 | fn mutates_argument_1 |
49-
| main.rs:172:5:172:24 | mutates_argument_2(...) | main.rs:152:1:158:1 | fn mutates_argument_2 |
41+
| main.rs:159:33:159:61 | test_async_await_async_part(...) | main.rs:143:1:153:1 | fn test_async_await_async_part |
42+
| main.rs:172:5:172:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
43+
| main.rs:173:5:173:26 | set_int(...) | main.rs:164:1:166:1 | fn set_int |
44+
| main.rs:173:16:173:25 | source(...) | main.rs:1:1:3:1 | fn source |
45+
| main.rs:174:5:174:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
46+
| main.rs:180:5:180:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
47+
| main.rs:181:5:181:31 | set_int(...) | main.rs:164:1:166:1 | fn set_int |
48+
| main.rs:181:21:181:30 | source(...) | main.rs:1:1:3:1 | fn source |
49+
| main.rs:182:5:182:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
50+
| main.rs:186:5:186:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
51+
| main.rs:187:5:187:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
52+
| main.rs:188:5:188:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
53+
| main.rs:189:5:189:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
54+
| main.rs:191:5:191:24 | data_out_of_method(...) | main.rs:86:1:90:1 | fn data_out_of_method |
55+
| main.rs:192:5:192:28 | data_in_to_method_call(...) | main.rs:92:1:96:1 | fn data_in_to_method_call |
56+
| main.rs:193:5:193:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
57+
| main.rs:195:5:195:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
58+
| main.rs:196:5:196:22 | test_async_await(...) | main.rs:155:1:160:1 | fn test_async_await |
59+
| main.rs:197:5:197:24 | mutates_argument_1(...) | main.rs:168:1:175:1 | fn mutates_argument_1 |
60+
| main.rs:198:5:198:24 | mutates_argument_2(...) | main.rs:177:1:183:1 | fn mutates_argument_2 |
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
identityLocalStep
2-
| main.rs:425:9:425:20 | phi(default_name) | Node steps to itself |
2+
| main.rs:428:9:428:20 | phi(default_name) | Node steps to itself |

0 commit comments

Comments
 (0)