Skip to content

Commit e1c65aa

Browse files
committed
Rust: Tuple writes target post update node
1 parent 3420f1f commit e1c65aa

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ module Node {
264264

265265
final override Location getLocation() { result = n.getLocation() }
266266

267-
final override string toString() { result = n.toString() }
267+
final override string toString() { result = "[post] " + n.toString() }
268268
}
269269

270270
final class CastNode = NaNode;
@@ -286,6 +286,9 @@ module SsaFlow {
286286
or
287287
result.(SsaFlow::ExprNode).getExpr() = n.asExpr()
288288
or
289+
result.(SsaFlow::ExprPostUpdateNode).getExpr() =
290+
n.(Node::PostUpdateNode).getPreUpdateNode().asExpr()
291+
or
289292
n = toParameterNode(result.(SsaFlow::ParameterNode).getParameter())
290293
}
291294

@@ -753,6 +756,15 @@ module RustDataFlow implements InputSig<Location> {
753756
pathResolveToStructCanonicalPath(re.getPath(), s)
754757
}
755758

759+
private predicate tupleAssignment(Node node1, Node node2, TuplePositionContent c) {
760+
exists(AssignmentExprCfgNode assignment, FieldExprCfgNode access |
761+
assignment.getLhs() = access and
762+
fieldTuplePositionContent(access, c) and
763+
node1.asExpr() = assignment.getRhs() and
764+
node2.asExpr() = access.getExpr()
765+
)
766+
}
767+
756768
/**
757769
* Holds if data can flow from `node1` to `node2` via a store into `c`. Thus,
758770
* `node2` references an object with a content `c.getAStoreContent()` that
@@ -786,12 +798,7 @@ module RustDataFlow implements InputSig<Location> {
786798
node2.asExpr() = tuple
787799
)
788800
or
789-
exists(AssignmentExprCfgNode assignment, FieldExprCfgNode access |
790-
assignment.getLhs() = access and
791-
fieldTuplePositionContent(access, c) and
792-
node1.asExpr() = assignment.getRhs() and
793-
node2.asExpr() = access.getExpr()
794-
)
801+
tupleAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
795802
)
796803
}
797804

@@ -801,11 +808,7 @@ module RustDataFlow implements InputSig<Location> {
801808
* in `x.f = newValue`.
802809
*/
803810
predicate clearsContent(Node n, ContentSet cs) {
804-
exists(AssignmentExprCfgNode assignment, FieldExprCfgNode access |
805-
assignment.getLhs() = access and
806-
n.asExpr() = access.getExpr() and
807-
fieldTuplePositionContent(access, cs.(SingletonContentSet).getContent())
808-
)
811+
tupleAssignment(_, n, cs.(SingletonContentSet).getContent())
809812
}
810813

811814
/**

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ localStep
8686
| main.rs:94:9:94:9 | [SSA] a | main.rs:95:10:95:10 | a |
8787
| main.rs:94:9:94:9 | a | main.rs:94:9:94:9 | [SSA] a |
8888
| main.rs:94:13:94:26 | TupleExpr | main.rs:94:9:94:9 | a |
89+
| main.rs:95:10:95:10 | [post] a | main.rs:96:10:96:10 | a |
8990
| main.rs:95:10:95:10 | a | main.rs:96:10:96:10 | a |
9091
| main.rs:100:9:100:9 | [SSA] a | main.rs:101:24:101:24 | a |
9192
| main.rs:100:9:100:9 | a | main.rs:100:9:100:9 | [SSA] a |
@@ -100,29 +101,39 @@ localStep
100101
| main.rs:108:9:108:13 | [SSA] a | main.rs:109:10:109:10 | a |
101102
| main.rs:108:9:108:13 | a | main.rs:108:9:108:13 | [SSA] a |
102103
| main.rs:108:17:108:31 | TupleExpr | main.rs:108:9:108:13 | a |
104+
| main.rs:109:10:109:10 | [post] a | main.rs:110:10:110:10 | a |
103105
| main.rs:109:10:109:10 | a | main.rs:110:10:110:10 | a |
106+
| main.rs:110:10:110:10 | [post] a | main.rs:111:5:111:5 | a |
104107
| main.rs:110:10:110:10 | a | main.rs:111:5:111:5 | a |
108+
| main.rs:111:5:111:5 | [post] a | main.rs:112:5:112:5 | a |
105109
| main.rs:111:5:111:5 | a | main.rs:112:5:112:5 | a |
106110
| main.rs:111:11:111:20 | source(...) | main.rs:111:5:111:7 | a.0 |
111+
| main.rs:112:5:112:5 | [post] a | main.rs:113:10:113:10 | a |
107112
| main.rs:112:5:112:5 | a | main.rs:113:10:113:10 | a |
108113
| main.rs:112:11:112:11 | 2 | main.rs:112:5:112:7 | a.1 |
114+
| main.rs:113:10:113:10 | [post] a | main.rs:114:10:114:10 | a |
109115
| main.rs:113:10:113:10 | a | main.rs:114:10:114:10 | a |
110116
| main.rs:118:9:118:9 | [SSA] a | main.rs:119:14:119:14 | a |
111117
| main.rs:118:9:118:9 | a | main.rs:118:9:118:9 | [SSA] a |
112118
| main.rs:118:13:118:27 | TupleExpr | main.rs:118:9:118:9 | a |
113119
| main.rs:119:9:119:9 | [SSA] b | main.rs:120:10:120:10 | b |
114120
| main.rs:119:9:119:9 | b | main.rs:119:9:119:9 | [SSA] b |
115121
| main.rs:119:13:119:18 | TupleExpr | main.rs:119:9:119:9 | b |
122+
| main.rs:120:10:120:10 | [post] b | main.rs:121:10:121:10 | b |
116123
| main.rs:120:10:120:10 | b | main.rs:121:10:121:10 | b |
124+
| main.rs:121:10:121:10 | [post] b | main.rs:122:10:122:10 | b |
117125
| main.rs:121:10:121:10 | b | main.rs:122:10:122:10 | b |
118126
| main.rs:134:9:134:9 | [SSA] p | main.rs:138:10:138:10 | p |
119127
| main.rs:134:9:134:9 | p | main.rs:134:9:134:9 | [SSA] p |
120128
| main.rs:134:13:137:5 | Point {...} | main.rs:134:9:134:9 | p |
129+
| main.rs:138:10:138:10 | [post] p | main.rs:139:10:139:10 | p |
121130
| main.rs:138:10:138:10 | p | main.rs:139:10:139:10 | p |
122131
| main.rs:143:9:143:13 | [SSA] p | main.rs:147:10:147:10 | p |
123132
| main.rs:143:9:143:13 | p | main.rs:143:9:143:13 | [SSA] p |
124133
| main.rs:143:17:146:5 | Point {...} | main.rs:143:9:143:13 | p |
134+
| main.rs:147:10:147:10 | [post] p | main.rs:148:5:148:5 | p |
125135
| main.rs:147:10:147:10 | p | main.rs:148:5:148:5 | p |
136+
| main.rs:148:5:148:5 | [post] p | main.rs:149:10:149:10 | p |
126137
| main.rs:148:5:148:5 | p | main.rs:149:10:149:10 | p |
127138
| main.rs:148:11:148:20 | source(...) | main.rs:148:5:148:7 | p.y |
128139
| main.rs:153:9:153:9 | [SSA] p | main.rs:157:32:157:32 | p |
@@ -136,7 +147,9 @@ localStep
136147
| main.rs:168:9:168:9 | [SSA] p | main.rs:175:10:175:10 | p |
137148
| main.rs:168:9:168:9 | p | main.rs:168:9:168:9 | [SSA] p |
138149
| main.rs:168:13:174:5 | Point3D {...} | main.rs:168:9:168:9 | p |
150+
| main.rs:175:10:175:10 | [post] p | main.rs:176:10:176:10 | p |
139151
| main.rs:175:10:175:10 | p | main.rs:176:10:176:10 | p |
152+
| main.rs:176:10:176:10 | [post] p | main.rs:177:10:177:10 | p |
140153
| main.rs:176:10:176:10 | p | main.rs:177:10:177:10 | p |
141154
| main.rs:181:9:181:9 | [SSA] p | main.rs:188:11:188:11 | p |
142155
| main.rs:181:9:181:9 | p | main.rs:181:9:181:9 | [SSA] p |
@@ -336,8 +349,8 @@ storeStep
336349
| main.rs:100:29:100:29 | 2 | tuple.2 | main.rs:100:13:100:30 | TupleExpr |
337350
| main.rs:108:18:108:18 | 2 | tuple.0 | main.rs:108:17:108:31 | TupleExpr |
338351
| main.rs:108:21:108:30 | source(...) | tuple.1 | main.rs:108:17:108:31 | TupleExpr |
339-
| main.rs:111:11:111:20 | source(...) | tuple.0 | main.rs:111:5:111:5 | a |
340-
| main.rs:112:11:112:11 | 2 | tuple.1 | main.rs:112:5:112:5 | a |
352+
| main.rs:111:11:111:20 | source(...) | tuple.0 | main.rs:111:5:111:5 | [post] a |
353+
| main.rs:112:11:112:11 | 2 | tuple.1 | main.rs:112:5:112:5 | [post] a |
341354
| main.rs:118:14:118:14 | 3 | tuple.0 | main.rs:118:13:118:27 | TupleExpr |
342355
| main.rs:118:17:118:26 | source(...) | tuple.1 | main.rs:118:13:118:27 | TupleExpr |
343356
| main.rs:119:14:119:14 | a | tuple.0 | main.rs:119:13:119:18 | TupleExpr |

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ edges
1111
| main.rs:108:17:108:31 | TupleExpr [tuple.1] | main.rs:110:10:110:10 | a [tuple.1] | provenance | |
1212
| main.rs:108:21:108:30 | source(...) | main.rs:108:17:108:31 | TupleExpr [tuple.1] | provenance | |
1313
| main.rs:110:10:110:10 | a [tuple.1] | main.rs:110:10:110:12 | a.1 | provenance | |
14-
| main.rs:111:5:111:5 | a [tuple.0] | main.rs:112:5:112:5 | a [tuple.0] | provenance | |
15-
| main.rs:111:11:111:20 | source(...) | main.rs:111:5:111:5 | a [tuple.0] | provenance | |
14+
| main.rs:111:5:111:5 | [post] a [tuple.0] | main.rs:112:5:112:5 | a [tuple.0] | provenance | |
15+
| main.rs:111:11:111:20 | source(...) | main.rs:111:5:111:5 | [post] a [tuple.0] | provenance | |
1616
| main.rs:112:5:112:5 | a [tuple.0] | main.rs:113:10:113:10 | a [tuple.0] | provenance | |
1717
| main.rs:113:10:113:10 | a [tuple.0] | main.rs:113:10:113:12 | a.0 | provenance | |
1818
| main.rs:118:13:118:27 | TupleExpr [tuple.1] | main.rs:119:14:119:14 | a [tuple.1] | provenance | |
@@ -63,7 +63,7 @@ nodes
6363
| main.rs:108:21:108:30 | source(...) | semmle.label | source(...) |
6464
| main.rs:110:10:110:10 | a [tuple.1] | semmle.label | a [tuple.1] |
6565
| main.rs:110:10:110:12 | a.1 | semmle.label | a.1 |
66-
| main.rs:111:5:111:5 | a [tuple.0] | semmle.label | a [tuple.0] |
66+
| main.rs:111:5:111:5 | [post] a [tuple.0] | semmle.label | [post] a [tuple.0] |
6767
| main.rs:111:11:111:20 | source(...) | semmle.label | source(...) |
6868
| main.rs:112:5:112:5 | a [tuple.0] | semmle.label | a [tuple.0] |
6969
| main.rs:113:10:113:10 | a [tuple.0] | semmle.label | a [tuple.0] |

0 commit comments

Comments
 (0)