Merge pull request #21596 from hvitved/rust/data-flow-closure-type · github/codeql@0694319 · GitHub
Skip to content

Commit 0694319

Browse files
authored
Merge pull request #21596 from hvitved/rust/data-flow-closure-type
Rust: Track closure types in data flow
2 parents 609621f + 23f0810 commit 0694319

4 files changed

Lines changed: 193 additions & 19 deletions

File tree

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

Lines changed: 101 additions & 12 deletions

‎rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ private module Debug {
291291
private import Content
292292
private import codeql.rust.dataflow.internal.DataFlowImpl
293293
private import codeql.rust.internal.typeinference.TypeMention
294-
private import codeql.rust.internal.typeinference.Type
294+
private import codeql.rust.internal.typeinference.Type as Type
295295

296296
private predicate relevantManualModel(SummarizedCallableImpl sc, string can) {
297297
exists(Provenance manual |
@@ -309,7 +309,7 @@ private module Debug {
309309
sc.propagatesFlow(input, _, _, _, _, _) and
310310
input.head() = SummaryComponent::argument(pos) and
311311
p = pos.getParameterIn(sc.getParamList()) and
312-
tm.getType() instanceof RefType and
312+
tm.getType() instanceof Type::RefType and
313313
not input.tail().head() = SummaryComponent::content(TSingletonContentSet(TReferenceContent()))
314314
|
315315
tm = p.getTypeRepr()
@@ -324,7 +324,7 @@ private module Debug {
324324
exists(TypeMention tm |
325325
relevantManualModel(sc, can) and
326326
sc.propagatesFlow(_, output, _, _, _, _) and
327-
tm.getType() instanceof RefType and
327+
tm.getType() instanceof Type::RefType and
328328
output.head() = SummaryComponent::return(_) and
329329
not output.tail().head() =
330330
SummaryComponent::content(TSingletonContentSet(TReferenceContent())) and

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

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ edges
1313
| main.rs:29:13:29:22 | f(...) | main.rs:29:9:29:9 | b | provenance | |
1414
| main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | provenance | |
1515
| main.rs:29:21:29:21 | a | main.rs:29:13:29:22 | f(...) | provenance | |
16-
| main.rs:37:16:37:25 | source(...) | main.rs:39:5:39:5 | [post] f [captured capt] | provenance | |
17-
| main.rs:39:5:39:5 | [post] f [captured capt] | main.rs:40:10:40:13 | capt | provenance | |
18-
| main.rs:39:5:39:5 | [post] f [captured capt] | main.rs:44:5:44:5 | g [captured capt] | provenance | |
16+
| main.rs:37:16:37:25 | source(...) | main.rs:39:5:39:5 | [post] f : ... => .. [captured capt] | provenance | |
17+
| main.rs:39:5:39:5 | [post] f : ... => .. [captured capt] | main.rs:40:10:40:13 | capt | provenance | |
18+
| main.rs:39:5:39:5 | [post] f : ... => .. [captured capt] | main.rs:44:5:44:5 | g [captured capt] | provenance | |
1919
| main.rs:44:5:44:5 | g [captured capt] | main.rs:42:14:42:17 | capt | provenance | |
2020
| main.rs:47:29:49:1 | { ... } | main.rs:57:10:57:12 | f(...) | provenance | |
2121
| main.rs:48:5:48:14 | source(...) | main.rs:47:29:49:1 | { ... } | provenance | |
@@ -30,6 +30,31 @@ edges
3030
| main.rs:77:13:77:22 | f(...) | main.rs:77:9:77:9 | b | provenance | |
3131
| main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | provenance | |
3232
| main.rs:77:21:77:21 | a | main.rs:77:13:77:22 | f(...) | provenance | |
33+
| main.rs:81:28:81:33 | ...: i64 | main.rs:82:7:82:7 | x | provenance | |
34+
| main.rs:81:28:81:33 | ...: i64 | main.rs:82:7:82:7 | x | provenance | |
35+
| main.rs:81:28:81:33 | ...: i64 | main.rs:82:7:82:7 | x | provenance | |
36+
| main.rs:82:7:82:7 | x | main.rs:87:12:87:12 | ... | provenance | |
37+
| main.rs:82:7:82:7 | x | main.rs:89:12:89:12 | ... | provenance | |
38+
| main.rs:82:7:82:7 | x | main.rs:99:17:99:17 | ... | provenance | |
39+
| main.rs:82:7:82:7 | x | main.rs:101:17:101:17 | ... | provenance | |
40+
| main.rs:86:9:86:9 | a | main.rs:87:24:87:24 | a | provenance | |
41+
| main.rs:86:13:86:22 | source(...) | main.rs:86:9:86:9 | a | provenance | |
42+
| main.rs:87:12:87:12 | ... | main.rs:87:20:87:20 | x | provenance | |
43+
| main.rs:87:24:87:24 | a | main.rs:81:28:81:33 | ...: i64 | provenance | |
44+
| main.rs:88:9:88:9 | b | main.rs:89:24:89:24 | b | provenance | |
45+
| main.rs:88:13:88:22 | source(...) | main.rs:88:9:88:9 | b | provenance | |
46+
| main.rs:89:12:89:12 | ... | main.rs:89:20:89:20 | x | provenance | |
47+
| main.rs:89:24:89:24 | b | main.rs:81:28:81:33 | ...: i64 | provenance | |
48+
| main.rs:93:33:93:38 | ...: i64 | main.rs:94:14:94:14 | x | provenance | |
49+
| main.rs:94:14:94:14 | x | main.rs:81:28:81:33 | ...: i64 | provenance | |
50+
| main.rs:98:9:98:9 | a | main.rs:99:29:99:29 | a | provenance | |
51+
| main.rs:98:13:98:22 | source(...) | main.rs:98:9:98:9 | a | provenance | |
52+
| main.rs:99:17:99:17 | ... | main.rs:99:25:99:25 | x | provenance | |
53+
| main.rs:99:29:99:29 | a | main.rs:93:33:93:38 | ...: i64 | provenance | |
54+
| main.rs:100:9:100:9 | b | main.rs:101:29:101:29 | b | provenance | |
55+
| main.rs:100:13:100:22 | source(...) | main.rs:100:9:100:9 | b | provenance | |
56+
| main.rs:101:17:101:17 | ... | main.rs:101:25:101:25 | x | provenance | |
57+
| main.rs:101:29:101:29 | b | main.rs:93:33:93:38 | ...: i64 | provenance | |
3358
nodes
3459
| main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
3560
| main.rs:10:30:10:39 | source(...) | semmle.label | source(...) |
@@ -48,7 +73,7 @@ nodes
4873
| main.rs:29:21:29:21 | a | semmle.label | a |
4974
| main.rs:30:10:30:10 | b | semmle.label | b |
5075
| main.rs:37:16:37:25 | source(...) | semmle.label | source(...) |
51-
| main.rs:39:5:39:5 | [post] f [captured capt] | semmle.label | [post] f [captured capt] |
76+
| main.rs:39:5:39:5 | [post] f : ... => .. [captured capt] | semmle.label | [post] f : ... => .. [captured capt] |
5277
| main.rs:40:10:40:13 | capt | semmle.label | capt |
5378
| main.rs:42:14:42:17 | capt | semmle.label | capt |
5479
| main.rs:44:5:44:5 | g [captured capt] | semmle.label | g [captured capt] |
@@ -68,6 +93,34 @@ nodes
6893
| main.rs:77:13:77:22 | f(...) | semmle.label | f(...) |
6994
| main.rs:77:21:77:21 | a | semmle.label | a |
7095
| main.rs:78:10:78:10 | b | semmle.label | b |
96+
| main.rs:81:28:81:33 | ...: i64 | semmle.label | ...: i64 |
97+
| main.rs:81:28:81:33 | ...: i64 | semmle.label | ...: i64 |
98+
| main.rs:81:28:81:33 | ...: i64 | semmle.label | ...: i64 |
99+
| main.rs:82:7:82:7 | x | semmle.label | x |
100+
| main.rs:82:7:82:7 | x | semmle.label | x |
101+
| main.rs:82:7:82:7 | x | semmle.label | x |
102+
| main.rs:86:9:86:9 | a | semmle.label | a |
103+
| main.rs:86:13:86:22 | source(...) | semmle.label | source(...) |
104+
| main.rs:87:12:87:12 | ... | semmle.label | ... |
105+
| main.rs:87:20:87:20 | x | semmle.label | x |
106+
| main.rs:87:24:87:24 | a | semmle.label | a |
107+
| main.rs:88:9:88:9 | b | semmle.label | b |
108+
| main.rs:88:13:88:22 | source(...) | semmle.label | source(...) |
109+
| main.rs:89:12:89:12 | ... | semmle.label | ... |
110+
| main.rs:89:20:89:20 | x | semmle.label | x |
111+
| main.rs:89:24:89:24 | b | semmle.label | b |
112+
| main.rs:93:33:93:38 | ...: i64 | semmle.label | ...: i64 |
113+
| main.rs:94:14:94:14 | x | semmle.label | x |
114+
| main.rs:98:9:98:9 | a | semmle.label | a |
115+
| main.rs:98:13:98:22 | source(...) | semmle.label | source(...) |
116+
| main.rs:99:17:99:17 | ... | semmle.label | ... |
117+
| main.rs:99:25:99:25 | x | semmle.label | x |
118+
| main.rs:99:29:99:29 | a | semmle.label | a |
119+
| main.rs:100:9:100:9 | b | semmle.label | b |
120+
| main.rs:100:13:100:22 | source(...) | semmle.label | source(...) |
121+
| main.rs:101:17:101:17 | ... | semmle.label | ... |
122+
| main.rs:101:25:101:25 | x | semmle.label | x |
123+
| main.rs:101:29:101:29 | b | semmle.label | b |
71124
subpaths
72125
| main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | main.rs:27:26:27:52 | if cond {...} else {...} | main.rs:29:13:29:22 | f(...) |
73126
| main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | main.rs:66:42:72:1 | { ... } | main.rs:77:13:77:22 | f(...) |
@@ -81,3 +134,9 @@ testFailures
81134
| main.rs:52:10:52:13 | data | main.rs:62:13:62:22 | source(...) | main.rs:52:10:52:13 | data | $@ | main.rs:62:13:62:22 | source(...) | source(...) |
82135
| main.rs:57:10:57:12 | f(...) | main.rs:48:5:48:14 | source(...) | main.rs:57:10:57:12 | f(...) | $@ | main.rs:48:5:48:14 | source(...) | source(...) |
83136
| main.rs:78:10:78:10 | b | main.rs:76:13:76:22 | source(...) | main.rs:78:10:78:10 | b | $@ | main.rs:76:13:76:22 | source(...) | source(...) |
137+
| main.rs:87:20:87:20 | x | main.rs:86:13:86:22 | source(...) | main.rs:87:20:87:20 | x | $@ | main.rs:86:13:86:22 | source(...) | source(...) |
138+
| main.rs:89:20:89:20 | x | main.rs:88:13:88:22 | source(...) | main.rs:89:20:89:20 | x | $@ | main.rs:88:13:88:22 | source(...) | source(...) |
139+
| main.rs:99:25:99:25 | x | main.rs:98:13:98:22 | source(...) | main.rs:99:25:99:25 | x | $@ | main.rs:98:13:98:22 | source(...) | source(...) |
140+
| main.rs:99:25:99:25 | x | main.rs:100:13:100:22 | source(...) | main.rs:99:25:99:25 | x | $@ | main.rs:100:13:100:22 | source(...) | source(...) |
141+
| main.rs:101:25:101:25 | x | main.rs:98:13:98:22 | source(...) | main.rs:101:25:101:25 | x | $@ | main.rs:98:13:98:22 | source(...) | source(...) |
142+
| main.rs:101:25:101:25 | x | main.rs:100:13:100:22 | source(...) | main.rs:101:25:101:25 | x | $@ | main.rs:100:13:100:22 | source(...) | source(...) |

‎rust/ql/test/library-tests/dataflow/lambdas/main.rs‎

Lines changed: 26 additions & 0 deletions

0 commit comments

Comments
 (0)