Skip to content

Commit 23bfa8a

Browse files
committed
Rust: Add local data flow edge for SSA definitons
1 parent bacc37d commit 23bfa8a

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ module Node {
145145

146146
PatNode() { this = TPatNode(n) }
147147

148-
/** Gets the Pat in the AST that this node corresponds to. */
148+
/** Gets the `Pat` in the AST that this node corresponds to. */
149149
Pat getPat() { result = n.getPat() }
150150
}
151151

@@ -282,6 +282,10 @@ module LocalFlow {
282282
nodeFrom.getCfgNode().getAstNode() = s.getInitializer() and
283283
nodeTo.getCfgNode().getAstNode() = s.getPat()
284284
)
285+
or
286+
// An edge from a pattern to its corresponding SSA definition.
287+
nodeFrom.(Node::PatNode).getPat() =
288+
nodeTo.(Node::SsaNode).getDefinitionExt().getSourceVariable().getPat()
285289
}
286290
}
287291

@@ -395,7 +399,14 @@ module RustDataFlow implements InputSig<Location> {
395399
* Holds if there is a simple local flow step from `node1` to `node2`. These
396400
* are the value-preserving intra-callable flow steps.
397401
*/
398-
predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) { none() }
402+
predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) {
403+
(
404+
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
405+
or
406+
SsaFlow::localFlowStep(_, nodeFrom, nodeTo, _)
407+
) and
408+
model = ""
409+
}
399410

400411
/**
401412
* Holds if data can flow from `node1` to `node2` through a non-local step
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,86 @@
11
| main.rs:3:11:3:11 | [SSA] i | main.rs:4:12:4:12 | i |
2+
| main.rs:3:11:3:11 | i | main.rs:3:11:3:11 | [SSA] i |
23
| main.rs:4:5:4:12 | ... + ... | main.rs:3:26:5:1 | BlockExpr |
34
| main.rs:7:9:7:9 | [SSA] s | main.rs:8:20:8:20 | s |
5+
| main.rs:7:9:7:9 | s | main.rs:7:9:7:9 | [SSA] s |
46
| main.rs:19:9:19:9 | [SSA] s | main.rs:20:10:20:10 | s |
7+
| main.rs:19:9:19:9 | s | main.rs:19:9:19:9 | [SSA] s |
58
| main.rs:19:13:19:21 | CallExpr | main.rs:19:9:19:9 | s |
69
| main.rs:23:18:23:21 | [SSA] cond | main.rs:26:16:26:19 | cond |
10+
| main.rs:23:18:23:21 | cond | main.rs:23:18:23:21 | [SSA] cond |
711
| main.rs:24:9:24:9 | [SSA] a | main.rs:26:23:26:23 | a |
12+
| main.rs:24:9:24:9 | a | main.rs:24:9:24:9 | [SSA] a |
813
| main.rs:24:13:24:21 | CallExpr | main.rs:24:9:24:9 | a |
914
| main.rs:25:9:25:9 | [SSA] b | main.rs:26:34:26:34 | b |
15+
| main.rs:25:9:25:9 | b | main.rs:25:9:25:9 | [SSA] b |
1016
| main.rs:25:13:25:13 | 2 | main.rs:25:9:25:9 | b |
1117
| main.rs:26:9:26:9 | [SSA] c | main.rs:27:10:27:10 | c |
18+
| main.rs:26:9:26:9 | c | main.rs:26:9:26:9 | [SSA] c |
1219
| main.rs:26:13:26:36 | IfExpr | main.rs:26:9:26:9 | c |
1320
| main.rs:26:21:26:25 | BlockExpr | main.rs:26:13:26:36 | IfExpr |
1421
| main.rs:26:23:26:23 | a | main.rs:26:21:26:25 | BlockExpr |
1522
| main.rs:26:32:26:36 | BlockExpr | main.rs:26:13:26:36 | IfExpr |
1623
| main.rs:26:34:26:34 | b | main.rs:26:32:26:36 | BlockExpr |
1724
| main.rs:30:21:30:21 | [SSA] m | main.rs:32:19:32:19 | m |
25+
| main.rs:30:21:30:21 | m | main.rs:30:21:30:21 | [SSA] m |
1826
| main.rs:31:9:31:9 | [SSA] a | main.rs:33:20:33:20 | a |
27+
| main.rs:31:9:31:9 | a | main.rs:31:9:31:9 | [SSA] a |
1928
| main.rs:31:13:31:21 | CallExpr | main.rs:31:9:31:9 | a |
2029
| main.rs:32:9:32:9 | [SSA] b | main.rs:36:10:36:10 | b |
30+
| main.rs:32:9:32:9 | b | main.rs:32:9:32:9 | [SSA] b |
2131
| main.rs:32:13:35:5 | MatchExpr | main.rs:32:9:32:9 | b |
2232
| main.rs:33:20:33:20 | a | main.rs:32:13:35:5 | MatchExpr |
2333
| main.rs:34:17:34:17 | 0 | main.rs:32:13:35:5 | MatchExpr |
2434
| main.rs:40:9:40:9 | [SSA] a | main.rs:43:10:43:10 | a |
35+
| main.rs:40:9:40:9 | a | main.rs:40:9:40:9 | [SSA] a |
2536
| main.rs:40:13:42:5 | LoopExpr | main.rs:40:9:40:9 | a |
2637
| main.rs:41:9:41:15 | BreakExpr | main.rs:40:13:42:5 | LoopExpr |
2738
| main.rs:41:15:41:15 | 1 | main.rs:41:9:41:15 | BreakExpr |
2839
| main.rs:44:9:44:9 | [SSA] b | main.rs:47:10:47:10 | b |
40+
| main.rs:44:9:44:9 | b | main.rs:44:9:44:9 | [SSA] b |
2941
| main.rs:44:13:46:5 | LoopExpr | main.rs:44:9:44:9 | b |
3042
| main.rs:45:9:45:23 | BreakExpr | main.rs:44:13:46:5 | LoopExpr |
3143
| main.rs:45:15:45:23 | CallExpr | main.rs:45:9:45:23 | BreakExpr |
3244
| main.rs:51:9:51:13 | [SSA] i | main.rs:52:10:52:10 | i |
45+
| main.rs:51:9:51:13 | i | main.rs:51:9:51:13 | [SSA] i |
46+
| main.rs:51:9:51:13 | i | main.rs:53:5:53:5 | [SSA] i |
3347
| main.rs:51:17:51:17 | 1 | main.rs:51:9:51:13 | i |
3448
| main.rs:53:5:53:5 | [SSA] i | main.rs:54:10:54:10 | i |
3549
| main.rs:53:5:53:5 | i | main.rs:53:5:53:5 | [SSA] i |
3650
| main.rs:61:9:61:9 | [SSA] i | main.rs:62:11:62:11 | i |
51+
| main.rs:61:9:61:9 | i | main.rs:61:9:61:9 | [SSA] i |
3752
| main.rs:61:13:61:31 | CallExpr | main.rs:61:9:61:9 | i |
3853
| main.rs:66:9:66:9 | [SSA] a | main.rs:67:10:67:10 | a |
54+
| main.rs:66:9:66:9 | a | main.rs:66:9:66:9 | [SSA] a |
3955
| main.rs:66:13:66:26 | TupleExpr | main.rs:66:9:66:9 | a |
4056
| main.rs:67:10:67:10 | a | main.rs:68:10:68:10 | a |
4157
| main.rs:78:9:78:9 | [SSA] p | main.rs:83:10:83:10 | p |
58+
| main.rs:78:9:78:9 | p | main.rs:78:9:78:9 | [SSA] p |
4259
| main.rs:78:13:82:5 | RecordExpr | main.rs:78:9:78:9 | p |
4360
| main.rs:83:10:83:10 | p | main.rs:84:10:84:10 | p |
4461
| main.rs:84:10:84:10 | p | main.rs:85:10:85:10 | p |
4562
| main.rs:92:9:92:9 | [SSA] p | main.rs:97:38:97:38 | p |
63+
| main.rs:92:9:92:9 | p | main.rs:92:9:92:9 | [SSA] p |
4664
| main.rs:92:13:96:5 | RecordExpr | main.rs:92:9:92:9 | p |
4765
| main.rs:97:20:97:20 | [SSA] a | main.rs:98:10:98:10 | a |
66+
| main.rs:97:20:97:20 | a | main.rs:97:20:97:20 | [SSA] a |
4867
| main.rs:97:26:97:26 | [SSA] b | main.rs:99:10:99:10 | b |
68+
| main.rs:97:26:97:26 | b | main.rs:97:26:97:26 | [SSA] b |
4969
| main.rs:97:32:97:32 | [SSA] c | main.rs:100:10:100:10 | c |
70+
| main.rs:97:32:97:32 | c | main.rs:97:32:97:32 | [SSA] c |
5071
| main.rs:97:38:97:38 | p | main.rs:97:9:97:34 | RecordPat |
5172
| main.rs:104:9:104:10 | [SSA] s1 | main.rs:106:11:106:12 | s1 |
73+
| main.rs:104:9:104:10 | s1 | main.rs:104:9:104:10 | [SSA] s1 |
5274
| main.rs:104:14:104:28 | CallExpr | main.rs:104:9:104:10 | s1 |
5375
| main.rs:105:9:105:10 | [SSA] s2 | main.rs:110:11:110:12 | s2 |
76+
| main.rs:105:9:105:10 | s2 | main.rs:105:9:105:10 | [SSA] s2 |
5477
| main.rs:105:14:105:20 | CallExpr | main.rs:105:9:105:10 | s2 |
5578
| main.rs:107:14:107:14 | [SSA] n | main.rs:107:25:107:25 | n |
79+
| main.rs:107:14:107:14 | n | main.rs:107:14:107:14 | [SSA] n |
5680
| main.rs:107:20:107:26 | CallExpr | main.rs:106:5:109:5 | MatchExpr |
5781
| main.rs:108:17:108:23 | CallExpr | main.rs:106:5:109:5 | MatchExpr |
5882
| main.rs:110:5:113:5 | MatchExpr | main.rs:103:27:114:1 | BlockExpr |
5983
| main.rs:111:14:111:14 | [SSA] n | main.rs:111:25:111:25 | n |
84+
| main.rs:111:14:111:14 | n | main.rs:111:14:111:14 | [SSA] n |
6085
| main.rs:111:20:111:26 | CallExpr | main.rs:110:5:113:5 | MatchExpr |
6186
| main.rs:112:17:112:23 | CallExpr | main.rs:110:5:113:5 | MatchExpr |
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
models
22
edges
3+
| main.rs:19:13:19:21 | CallExpr : unit | main.rs:20:10:20:10 | s | provenance | |
4+
| main.rs:24:13:24:21 | CallExpr : unit | main.rs:27:10:27:10 | c | provenance | |
5+
| main.rs:31:13:31:21 | CallExpr : unit | main.rs:36:10:36:10 | b | provenance | |
6+
| main.rs:45:15:45:23 | CallExpr : unit | main.rs:47:10:47:10 | b | provenance | |
37
nodes
48
| main.rs:15:10:15:18 | CallExpr | semmle.label | CallExpr |
9+
| main.rs:19:13:19:21 | CallExpr : unit | semmle.label | CallExpr : unit |
10+
| main.rs:20:10:20:10 | s | semmle.label | s |
11+
| main.rs:24:13:24:21 | CallExpr : unit | semmle.label | CallExpr : unit |
12+
| main.rs:27:10:27:10 | c | semmle.label | c |
13+
| main.rs:31:13:31:21 | CallExpr : unit | semmle.label | CallExpr : unit |
14+
| main.rs:36:10:36:10 | b | semmle.label | b |
15+
| main.rs:45:15:45:23 | CallExpr : unit | semmle.label | CallExpr : unit |
16+
| main.rs:47:10:47:10 | b | semmle.label | b |
517
subpaths
618
testFailures
719
#select
820
| main.rs:15:10:15:18 | CallExpr | main.rs:15:10:15:18 | CallExpr | main.rs:15:10:15:18 | CallExpr | $@ | main.rs:15:10:15:18 | CallExpr | CallExpr |
21+
| main.rs:20:10:20:10 | s | main.rs:19:13:19:21 | CallExpr : unit | main.rs:20:10:20:10 | s | $@ | main.rs:19:13:19:21 | CallExpr : unit | CallExpr : unit |
22+
| main.rs:27:10:27:10 | c | main.rs:24:13:24:21 | CallExpr : unit | main.rs:27:10:27:10 | c | $@ | main.rs:24:13:24:21 | CallExpr : unit | CallExpr : unit |
23+
| main.rs:36:10:36:10 | b | main.rs:31:13:31:21 | CallExpr : unit | main.rs:36:10:36:10 | b | $@ | main.rs:31:13:31:21 | CallExpr : unit | CallExpr : unit |
24+
| main.rs:47:10:47:10 | b | main.rs:45:15:45:23 | CallExpr : unit | main.rs:47:10:47:10 | b | $@ | main.rs:45:15:45:23 | CallExpr : unit | CallExpr : unit |

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ fn direct() {
1717

1818
fn variable_usage() {
1919
let s = source(1);
20-
sink(s); // $ MISSING: hasValueFlow=1
20+
sink(s); // $ hasValueFlow=1
2121
}
2222

2323
fn if_expression(cond: bool) {
2424
let a = source(1);
2525
let b = 2;
2626
let c = if cond { a } else { b };
27-
sink(c); // $ MISSING: hasValueFlow=1
27+
sink(c); // $ hasValueFlow=1
2828
}
2929

3030
fn match_expression(m: Option<i64>) {
@@ -33,7 +33,7 @@ fn match_expression(m: Option<i64>) {
3333
Some(_) => a,
3434
None => 0,
3535
};
36-
sink(b); // $ MISSING: hasValueFlow=1
36+
sink(b); // $ hasValueFlow=1
3737
}
3838

3939
fn loop_with_break() {
@@ -44,7 +44,7 @@ fn loop_with_break() {
4444
let b = loop {
4545
break source(1);
4646
};
47-
sink(b); // $ MISSING: hasValueFlow=1
47+
sink(b); // $ hasValueFlow=1
4848
}
4949

5050
fn assignment() {

0 commit comments

Comments
 (0)