Skip to content

Commit 6afe533

Browse files
committed
Rust: Fixes to flow through captured variables
1 parent cd08b22 commit 6afe533

9 files changed

Lines changed: 154 additions & 96 deletions

File tree

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

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import rust
1111
private import SsaImpl as SsaImpl
1212
private import codeql.rust.controlflow.internal.Scope as Scope
1313
private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl
14+
private import codeql.rust.elements.internal.VariableImpl::Impl as VariableImpl
1415
private import codeql.rust.internal.PathResolution
1516
private import codeql.rust.controlflow.ControlFlowGraph
1617
private import codeql.rust.dataflow.Ssa
@@ -230,7 +231,16 @@ module LocalFlow {
230231
nodeTo.asPat() = match.getAnArm().getPat()
231232
)
232233
or
233-
nodeFrom.asExpr() = nodeTo.asExpr().(ParenExpr).getExpr()
234+
exists(ParenExpr pe, Expr e |
235+
e = pe.getExpr() and
236+
if VariableImpl::assignmentOperationDescendant(_, pe)
237+
then nodeTo.asExpr() = e and nodeFrom.asExpr() = pe
238+
else (
239+
nodeFrom.asExpr() = e and nodeTo.asExpr() = pe
240+
)
241+
)
242+
or
243+
nodeTo.asPat() = nodeFrom.asPat().(ParenPat).getPat()
234244
}
235245

236246
pragma[nomagic]
@@ -1070,43 +1080,36 @@ module VariableCapture {
10701080
final class CapturedParameter extends CapturedVariable {
10711081
ParamBase p;
10721082

1073-
CapturedParameter() { p = this.getParameter() }
1083+
CapturedParameter() { this.isParameter(p) }
10741084

10751085
SourceParameterNode getParameterNode() { result.getParameter() = p }
10761086
}
10771087

10781088
class Expr extends AstNode {
1079-
predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) { this = bb.getNode(i).getAstNode() }
1089+
predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) {
1090+
this = bb.getNode(i).getAstNode()
1091+
or
1092+
this.(ParenExpr).getExpr().(Expr).hasCfgNode(bb, i)
1093+
}
10801094
}
10811095

10821096
class VariableWrite extends Expr {
1083-
Expr source;
10841097
CapturedVariable v;
10851098

10861099
VariableWrite() {
1087-
exists(AssignmentExpr assign, Variable::VariableWriteAccess write |
1088-
this = assign and
1089-
v = write.getVariable() and
1090-
assign.getLhs() = write and
1091-
assign.getRhs() = source
1092-
)
1100+
this = v.getName()
10931101
or
1094-
this =
1095-
any(LetStmt ls |
1096-
v.getPat() = ls.getPat() and
1097-
ls.getInitializer() = source
1098-
)
1102+
v = this.(Variable::VariableWriteAccess).getVariable()
1103+
}
1104+
1105+
override predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) {
1106+
not this instanceof VariableWriteAccess and
1107+
super.hasCfgNode(bb, i)
10991108
or
1100-
this =
1101-
any(LetExpr le |
1102-
v.getPat() = le.getPat() and
1103-
le.getScrutinee() = source
1104-
)
1109+
this.(VariableWriteAccess).getAssignmentExpr() = bb.getNode(i).getAstNode()
11051110
}
11061111

11071112
CapturedVariable getVariable() { result = v }
1108-
1109-
Expr getSource() { result = source }
11101113
}
11111114

11121115
class VariableRead extends Expr {
@@ -1145,7 +1148,7 @@ module VariableCapture {
11451148
or
11461149
result.(Flow::ExprNode).getExpr() = n.asExpr()
11471150
or
1148-
result.(Flow::VariableWriteSourceNode).getVariableWrite().getSource() = n.asExpr()
1151+
result.(Flow::VariableWriteSourceNode).getVariableWrite() = n.getAstNode()
11491152
or
11501153
result.(Flow::ExprPostUpdateNode).getExpr() = n.(PostUpdateNode).getPreUpdateNode().asExpr()
11511154
or

‎rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,12 @@ module Impl {
310310
/** Holds if this variable is captured. */
311311
predicate isCaptured() { this.getAnAccess().isCapture() }
312312

313-
/** Gets the parameter that introduces this variable, if any. */
313+
/**
314+
* Gets the parameter that introduces this variable, if any.
315+
*
316+
* Note that this variable need not be a direct parameter; it could
317+
* also be introduced through a destructuring pattern.
318+
*/
314319
cached
315320
ParamBase getParameter() {
316321
CachedStage::ref() and
@@ -319,6 +324,14 @@ module Impl {
319324
result.(Param).getPat() = getAPatAncestor*(this.getPat())
320325
}
321326

327+
/** Holds if this variable corresponds directly to the parameter `p`. */
328+
predicate isParameter(ParamBase p) {
329+
CachedStage::ref() and
330+
p = this.getSelfParam()
331+
or
332+
p.(Param).getPat() = this.getPat()
333+
}
334+
322335
/** Holds if this variable is mutable. */
323336
predicate isMutable() { this.getPat().isMut() or this.getSelfParam().isMut() }
324337

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2348,7 +2348,7 @@ private module Input3 implements InputSig3 {
23482348

23492349
AstNode getDefiningNode() {
23502350
result = this.asLocalVariable().getPat().getName() or
2351-
result = this.asLocalVariable().getParameter().(SelfParam) or
2351+
this.asLocalVariable().isParameter(result.(SelfParam)) or
23522352
result = this.asConst().getName() or
23532353
result = this.asStatic().getName()
23542354
}

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

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
models
2+
| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value |
23
edges
34
| main.rs:10:20:10:52 | if cond {...} else {...} | main.rs:11:10:11:16 | f(...) | provenance | |
45
| main.rs:10:30:10:39 | source(...) | main.rs:10:20:10:52 | if cond {...} else {...} | provenance | |
56
| main.rs:15:20:15:23 | ... | main.rs:17:18:17:21 | data | provenance | |
67
| main.rs:22:9:22:9 | a | main.rs:23:13:23:13 | a | provenance | |
78
| main.rs:22:13:22:22 | source(...) | main.rs:22:9:22:9 | a | provenance | |
89
| main.rs:23:13:23:13 | a | main.rs:15:20:15:23 | ... | provenance | |
9-
| main.rs:48:16:48:25 | source(...) | main.rs:50:5:50:5 | [post] f : ... => .. [captured capt] | provenance | |
10+
| main.rs:27:9:27:18 | TuplePat [tuple.0] | main.rs:27:10:27:14 | mut x | provenance | |
11+
| main.rs:27:10:27:14 | mut x | main.rs:28:6:28:6 | x | provenance | |
12+
| main.rs:27:22:27:35 | TupleExpr [tuple.0] | main.rs:27:9:27:18 | TuplePat [tuple.0] | provenance | |
13+
| main.rs:27:23:27:31 | source(...) | main.rs:27:22:27:35 | TupleExpr [tuple.0] | provenance | |
14+
| main.rs:28:6:28:6 | x | main.rs:29:14:29:14 | x | provenance | |
15+
| main.rs:33:9:33:16 | TuplePat [tuple.0] | main.rs:33:10:33:14 | ref x | provenance | |
16+
| main.rs:33:10:33:14 | ref x | main.rs:33:14:33:14 | x [&ref] | provenance | |
17+
| main.rs:33:14:33:14 | x [&ref] | main.rs:34:15:34:15 | x [&ref] | provenance | |
18+
| main.rs:33:20:33:31 | TupleExpr [tuple.0] | main.rs:33:9:33:16 | TuplePat [tuple.0] | provenance | |
19+
| main.rs:33:21:33:29 | source(...) | main.rs:33:20:33:31 | TupleExpr [tuple.0] | provenance | |
20+
| main.rs:34:15:34:15 | x [&ref] | main.rs:34:14:34:15 | * ... | provenance | MaD:1 |
21+
| main.rs:38:20:38:27 | ... | main.rs:38:30:38:56 | if cond {...} else {...} | provenance | |
22+
| main.rs:39:9:39:9 | a | main.rs:40:21:40:21 | a | provenance | |
23+
| main.rs:39:13:39:22 | source(...) | main.rs:39:9:39:9 | a | provenance | |
24+
| main.rs:40:9:40:9 | b | main.rs:41:10:41:10 | b | provenance | |
25+
| main.rs:40:13:40:22 | f(...) | main.rs:40:9:40:9 | b | provenance | |
26+
| main.rs:40:21:40:21 | a | main.rs:38:20:38:27 | ... | provenance | |
27+
| main.rs:40:21:40:21 | a | main.rs:40:13:40:22 | f(...) | provenance | |
28+
| main.rs:48:9:48:12 | capt | main.rs:50:5:50:5 | [post] f : ... => .. [captured capt] | provenance | |
29+
| main.rs:48:16:48:25 | source(...) | main.rs:48:9:48:12 | capt | provenance | |
1030
| main.rs:50:5:50:5 | [post] f : ... => .. [captured capt] | main.rs:51:10:51:13 | capt | provenance | |
1131
| main.rs:50:5:50:5 | [post] f : ... => .. [captured capt] | main.rs:55:5:55:5 | g [captured capt] | provenance | |
1232
| main.rs:55:5:55:5 | g [captured capt] | main.rs:53:14:53:17 | capt | provenance | |
@@ -48,22 +68,26 @@ edges
4868
| main.rs:111:13:111:22 | source(...) | main.rs:111:9:111:9 | b | provenance | |
4969
| main.rs:112:17:112:17 | ... | main.rs:112:25:112:25 | x | provenance | |
5070
| main.rs:112:29:112:29 | b | main.rs:104:33:104:38 | ...: i64 | provenance | |
51-
| main.rs:120:13:120:22 | source(...) | main.rs:121:26:121:36 | \|...\| ... : ... => .. [captured a] | provenance | |
52-
| main.rs:120:13:120:22 | source(...) | main.rs:122:26:122:36 | \|...\| ... : ... => .. [captured a] | provenance | |
53-
| main.rs:120:13:120:22 | source(...) | main.rs:123:26:123:36 | \|...\| ... : ... => .. [captured a] | provenance | |
54-
| main.rs:120:13:120:22 | source(...) | main.rs:124:26:124:36 | \|...\| ... : ... => .. [captured a] | provenance | |
71+
| main.rs:120:9:120:9 | a | main.rs:121:26:121:36 | \|...\| ... : ... => .. [captured a] | provenance | |
72+
| main.rs:120:9:120:9 | a | main.rs:122:26:122:36 | \|...\| ... : ... => .. [captured a] | provenance | |
73+
| main.rs:120:9:120:9 | a | main.rs:123:26:123:36 | \|...\| ... : ... => .. [captured a] | provenance | |
74+
| main.rs:120:9:120:9 | a | main.rs:124:26:124:36 | \|...\| ... : ... => .. [captured a] | provenance | |
75+
| main.rs:120:13:120:22 | source(...) | main.rs:120:9:120:9 | a | provenance | |
5576
| main.rs:121:26:121:36 | \|...\| ... : ... => .. [captured a] | main.rs:121:35:121:35 | a | provenance | heuristic-callback |
5677
| main.rs:122:26:122:36 | \|...\| ... : ... => .. [captured a] | main.rs:122:35:122:35 | a | provenance | heuristic-callback |
5778
| main.rs:123:26:123:36 | \|...\| ... : ... => .. [captured a] | main.rs:123:35:123:35 | a | provenance | heuristic-callback |
5879
| main.rs:124:26:124:36 | \|...\| ... : ... => .. [captured a] | main.rs:124:35:124:35 | a | provenance | heuristic-callback |
5980
| main.rs:131:30:131:40 | source(...) | main.rs:132:14:132:25 | await future | provenance | |
60-
| main.rs:136:20:136:30 | source(...) | main.rs:137:9:139:9 | { ... } : ... => .. [captured data] | provenance | |
81+
| main.rs:136:13:136:16 | data | main.rs:137:9:139:9 | { ... } : ... => .. [captured data] | provenance | |
82+
| main.rs:136:20:136:30 | source(...) | main.rs:136:13:136:16 | data | provenance | |
6183
| main.rs:137:9:139:9 | { ... } : ... => .. [captured data] | main.rs:138:18:138:21 | data | provenance | |
62-
| main.rs:144:20:144:30 | source(...) | main.rs:146:14:146:19 | future [captured data] | provenance | |
84+
| main.rs:144:13:144:16 | data | main.rs:146:14:146:19 | future [captured data] | provenance | |
85+
| main.rs:144:20:144:30 | source(...) | main.rs:144:13:144:16 | data | provenance | |
6386
| main.rs:146:14:146:19 | future [captured data] | main.rs:145:30:145:33 | data | provenance | |
6487
| main.rs:146:14:146:19 | future [captured data] | main.rs:146:14:146:25 | await future | provenance | |
6588
| main.rs:152:9:154:9 | [post] { ... } : ... => .. [captured captured] | main.rs:156:14:156:21 | captured | provenance | |
66-
| main.rs:153:24:153:34 | source(...) | main.rs:152:9:154:9 | [post] { ... } : ... => .. [captured captured] | provenance | |
89+
| main.rs:153:13:153:20 | captured | main.rs:152:9:154:9 | [post] { ... } : ... => .. [captured captured] | provenance | |
90+
| main.rs:153:24:153:34 | source(...) | main.rs:153:13:153:20 | captured | provenance | |
6791
nodes
6892
| main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
6993
| main.rs:10:30:10:39 | source(...) | semmle.label | source(...) |
@@ -73,6 +97,28 @@ nodes
7397
| main.rs:22:9:22:9 | a | semmle.label | a |
7498
| main.rs:22:13:22:22 | source(...) | semmle.label | source(...) |
7599
| main.rs:23:13:23:13 | a | semmle.label | a |
100+
| main.rs:27:9:27:18 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
101+
| main.rs:27:10:27:14 | mut x | semmle.label | mut x |
102+
| main.rs:27:22:27:35 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
103+
| main.rs:27:23:27:31 | source(...) | semmle.label | source(...) |
104+
| main.rs:28:6:28:6 | x | semmle.label | x |
105+
| main.rs:29:14:29:14 | x | semmle.label | x |
106+
| main.rs:33:9:33:16 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
107+
| main.rs:33:10:33:14 | ref x | semmle.label | ref x |
108+
| main.rs:33:14:33:14 | x [&ref] | semmle.label | x [&ref] |
109+
| main.rs:33:20:33:31 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
110+
| main.rs:33:21:33:29 | source(...) | semmle.label | source(...) |
111+
| main.rs:34:14:34:15 | * ... | semmle.label | * ... |
112+
| main.rs:34:15:34:15 | x [&ref] | semmle.label | x [&ref] |
113+
| main.rs:38:20:38:27 | ... | semmle.label | ... |
114+
| main.rs:38:30:38:56 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
115+
| main.rs:39:9:39:9 | a | semmle.label | a |
116+
| main.rs:39:13:39:22 | source(...) | semmle.label | source(...) |
117+
| main.rs:40:9:40:9 | b | semmle.label | b |
118+
| main.rs:40:13:40:22 | f(...) | semmle.label | f(...) |
119+
| main.rs:40:21:40:21 | a | semmle.label | a |
120+
| main.rs:41:10:41:10 | b | semmle.label | b |
121+
| main.rs:48:9:48:12 | capt | semmle.label | capt |
76122
| main.rs:48:16:48:25 | source(...) | semmle.label | source(...) |
77123
| main.rs:50:5:50:5 | [post] f : ... => .. [captured capt] | semmle.label | [post] f : ... => .. [captured capt] |
78124
| main.rs:51:10:51:13 | capt | semmle.label | capt |
@@ -122,6 +168,7 @@ nodes
122168
| main.rs:112:17:112:17 | ... | semmle.label | ... |
123169
| main.rs:112:25:112:25 | x | semmle.label | x |
124170
| main.rs:112:29:112:29 | b | semmle.label | b |
171+
| main.rs:120:9:120:9 | a | semmle.label | a |
125172
| main.rs:120:13:120:22 | source(...) | semmle.label | source(...) |
126173
| main.rs:121:26:121:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] |
127174
| main.rs:121:35:121:35 | a | semmle.label | a |
@@ -133,23 +180,30 @@ nodes
133180
| main.rs:124:35:124:35 | a | semmle.label | a |
134181
| main.rs:131:30:131:40 | source(...) | semmle.label | source(...) |
135182
| main.rs:132:14:132:25 | await future | semmle.label | await future |
183+
| main.rs:136:13:136:16 | data | semmle.label | data |
136184
| main.rs:136:20:136:30 | source(...) | semmle.label | source(...) |
137185
| main.rs:137:9:139:9 | { ... } : ... => .. [captured data] | semmle.label | { ... } : ... => .. [captured data] |
138186
| main.rs:138:18:138:21 | data | semmle.label | data |
187+
| main.rs:144:13:144:16 | data | semmle.label | data |
139188
| main.rs:144:20:144:30 | source(...) | semmle.label | source(...) |
140189
| main.rs:145:30:145:33 | data | semmle.label | data |
141190
| main.rs:146:14:146:19 | future [captured data] | semmle.label | future [captured data] |
142191
| main.rs:146:14:146:25 | await future | semmle.label | await future |
143192
| main.rs:152:9:154:9 | [post] { ... } : ... => .. [captured captured] | semmle.label | [post] { ... } : ... => .. [captured captured] |
193+
| main.rs:153:13:153:20 | captured | semmle.label | captured |
144194
| main.rs:153:24:153:34 | source(...) | semmle.label | source(...) |
145195
| main.rs:156:14:156:21 | captured | semmle.label | captured |
146196
subpaths
197+
| main.rs:40:21:40:21 | a | main.rs:38:20:38:27 | ... | main.rs:38:30:38:56 | if cond {...} else {...} | main.rs:40:13:40:22 | f(...) |
147198
| main.rs:88:21:88:21 | a | main.rs:77:24:77:32 | ...: i64 | main.rs:77:42:83:1 | { ... } | main.rs:88:13:88:22 | f(...) |
148199
| main.rs:146:14:146:19 | future [captured data] | main.rs:145:30:145:33 | data | main.rs:145:30:145:33 | data | main.rs:146:14:146:25 | await future |
149200
testFailures
150201
#select
151202
| main.rs:11:10:11:16 | f(...) | main.rs:10:30:10:39 | source(...) | main.rs:11:10:11:16 | f(...) | $@ | main.rs:10:30:10:39 | source(...) | source(...) |
152203
| main.rs:17:18:17:21 | data | main.rs:22:13:22:22 | source(...) | main.rs:17:18:17:21 | data | $@ | main.rs:22:13:22:22 | source(...) | source(...) |
204+
| main.rs:29:14:29:14 | x | main.rs:27:23:27:31 | source(...) | main.rs:29:14:29:14 | x | $@ | main.rs:27:23:27:31 | source(...) | source(...) |
205+
| main.rs:34:14:34:15 | * ... | main.rs:33:21:33:29 | source(...) | main.rs:34:14:34:15 | * ... | $@ | main.rs:33:21:33:29 | source(...) | source(...) |
206+
| main.rs:41:10:41:10 | b | main.rs:39:13:39:22 | source(...) | main.rs:41:10:41:10 | b | $@ | main.rs:39:13:39:22 | source(...) | source(...) |
153207
| main.rs:51:10:51:13 | capt | main.rs:48:16:48:25 | source(...) | main.rs:51:10:51:13 | capt | $@ | main.rs:48:16:48:25 | source(...) | source(...) |
154208
| main.rs:53:14:53:17 | capt | main.rs:48:16:48:25 | source(...) | main.rs:53:14:53:17 | capt | $@ | main.rs:48:16:48:25 | source(...) | source(...) |
155209
| main.rs:63:10:63:13 | data | main.rs:73:13:73:22 | source(...) | main.rs:63:10:63:13 | data | $@ | main.rs:73:13:73:22 | source(...) | source(...) |

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ fn closure_flow_in() {
2626
fn closure_flow_in2() {
2727
let (mut x, y) = (source(1), 0);
2828
(x) = x;
29-
(|| sink(x))(); // $ MISSING: hasValueFlow=1
29+
(|| sink(x))(); // $ hasValueFlow=1
3030
}
3131

3232
fn closure_flow_in3() {
3333
let (ref x,) = (source(1),);
34-
(|| sink(*x))(); // $ MISSING: hasValueFlow=1
34+
(|| sink(*x))(); // $ hasValueFlow=1
3535
}
3636

3737
fn closure_flow_through() {
3838
let f = |cond, ((data))| if cond { data } else { 0 };
3939
let a = source(43);
4040
let b = f(true, a);
41-
sink(b); // $ MISSING: hasValueFlow=43
41+
sink(b); // $ hasValueFlow=43
4242
}
4343

4444
fn closure_captured_variable() {

‎rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,8 +672,8 @@ localStep
672672
| main.rs:478:39:478:72 | ...: Vec::<...> | main.rs:478:39:478:43 | names |
673673
| main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | [SSA] default_name |
674674
| main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | default_name |
675+
| main.rs:479:9:479:20 | default_name | main.rs:480:9:480:20 | SSA phi read(default_name) |
675676
| main.rs:479:24:479:45 | ... .to_string() | main.rs:479:9:479:20 | default_name |
676-
| main.rs:479:24:479:45 | ... .to_string() | main.rs:480:9:480:20 | SSA phi read(default_name) |
677677
| main.rs:480:5:486:5 | for ... in ... { ... } | main.rs:478:75:487:1 | { ... } |
678678
| main.rs:480:9:480:20 | SSA phi read(default_name) | main.rs:482:41:482:67 | default_name |
679679
| main.rs:480:10:480:13 | [SSA] cond | main.rs:481:12:481:15 | cond |

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,10 @@ edges
191191
| main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | |
192192
| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:28 |
193193
| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:28 |
194-
| main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | |
195-
| main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | |
194+
| main.rs:212:9:212:9 | s | main.rs:214:23:214:23 | f [captured s] | provenance | |
195+
| main.rs:212:9:212:9 | s | main.rs:214:23:214:23 | f [captured s] | provenance | |
196+
| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | |
197+
| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | |
196198
| main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | |
197199
| main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | |
198200
| main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | |
@@ -596,6 +598,8 @@ nodes
596598
| main.rs:205:14:205:14 | n | semmle.label | n |
597599
| main.rs:208:11:208:11 | s | semmle.label | s |
598600
| main.rs:208:11:208:11 | s | semmle.label | s |
601+
| main.rs:212:9:212:9 | s | semmle.label | s |
602+
| main.rs:212:9:212:9 | s | semmle.label | s |
599603
| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) |
600604
| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) |
601605
| main.rs:213:17:213:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} |

0 commit comments

Comments
 (0)