Skip to content

Commit ed6500a

Browse files
committed
Rust: Make MaD barrier guards work
1 parent 56d459a commit ed6500a

File tree

3 files changed

+11
-15
lines changed

3 files changed

+11
-15
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,9 @@ private module Cached {
11581158
predicate sinkNode(Node n, string kind) { n.(FlowSummaryNode).isSink(kind, _) }
11591159

11601160
private newtype TKindModelPair =
1161-
TMkPair(string kind, string model) { FlowSummaryImpl::Private::barrierSpec(_, _, kind, model) }
1161+
TMkPair(string kind, string model) {
1162+
FlowSummaryImpl::Private::barrierGuardSpec(_, _, _, kind, model)
1163+
}
11621164

11631165
private boolean convertAcceptingValue(FlowSummaryImpl::Public::AcceptingValue av) {
11641166
av.isTrue() and result = true
@@ -1177,17 +1179,17 @@ private module Cached {
11771179
// av.isNotNull() and result.isNonNullValue()
11781180
}
11791181

1180-
private predicate barrierGuardChecks(Node g, Expr e, boolean gv, TKindModelPair kmp) {
1182+
private predicate barrierGuardChecks(AstNode g, Expr e, boolean gv, TKindModelPair kmp) {
11811183
exists(
1182-
FlowSummaryImpl::Public::BarrierElement n,
1184+
FlowSummaryImpl::Public::BarrierGuardElement b,
1185+
FlowSummaryImpl::Private::SummaryComponentStack stack,
11831186
FlowSummaryImpl::Public::AcceptingValue acceptingvalue, string kind, string model
11841187
|
1185-
FlowSummaryImpl::Private::barrierSpec(n, acceptingvalue, kind, model) and
1186-
n.asNode().asExpr() = e and
1188+
FlowSummaryImpl::Private::barrierGuardSpec(b, stack, acceptingvalue, kind, model) and
1189+
e = FlowSummaryImpl::StepsInput::getSinkNode(b, stack.headOfSingleton()).asExpr() and
11871190
kmp = TMkPair(kind, model) and
1188-
gv = convertAcceptingValue(acceptingvalue)
1189-
|
1190-
g.asExpr().(CallExpr).getAnArgument() = e // TODO: qualifier?
1191+
gv = convertAcceptingValue(acceptingvalue) and
1192+
g = b.getCall()
11911193
)
11921194
}
11931195

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ edges
44
| main.rs:21:13:21:21 | source(...) | main.rs:21:9:21:9 | s | provenance | |
55
| main.rs:32:9:32:9 | s | main.rs:33:10:33:10 | s | provenance | |
66
| main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | s | provenance | |
7-
| main.rs:44:9:44:9 | s | main.rs:46:14:46:14 | s | provenance | |
8-
| main.rs:44:13:44:21 | source(...) | main.rs:44:9:44:9 | s | provenance | |
97
nodes
108
| main.rs:17:10:17:18 | source(...) | semmle.label | source(...) |
119
| main.rs:21:9:21:9 | s | semmle.label | s |
@@ -14,13 +12,9 @@ nodes
1412
| main.rs:32:9:32:9 | s | semmle.label | s |
1513
| main.rs:32:13:32:21 | source(...) | semmle.label | source(...) |
1614
| main.rs:33:10:33:10 | s | semmle.label | s |
17-
| main.rs:44:9:44:9 | s | semmle.label | s |
18-
| main.rs:44:13:44:21 | source(...) | semmle.label | source(...) |
19-
| main.rs:46:14:46:14 | s | semmle.label | s |
2015
subpaths
2116
testFailures
2217
#select
2318
| main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | $@ | main.rs:17:10:17:18 | source(...) | source(...) |
2419
| main.rs:22:10:22:10 | s | main.rs:21:13:21:21 | source(...) | main.rs:22:10:22:10 | s | $@ | main.rs:21:13:21:21 | source(...) | source(...) |
2520
| main.rs:33:10:33:10 | s | main.rs:32:13:32:21 | source(...) | main.rs:33:10:33:10 | s | $@ | main.rs:32:13:32:21 | source(...) | source(...) |
26-
| main.rs:46:14:46:14 | s | main.rs:44:13:44:21 | source(...) | main.rs:46:14:46:14 | s | $@ | main.rs:44:13:44:21 | source(...) | source(...) |

shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1587,7 +1587,7 @@ module Make<
15871587
/**
15881588
* Holds if `barrierGuard` is a relevant barrier guard element with input specification `inSpec`.
15891589
*/
1590-
predicate barrierSpec(
1590+
predicate barrierGuardSpec(
15911591
BarrierGuardElement barrierGuard, SummaryComponentStack inSpec, string branch, string kind,
15921592
string model
15931593
) {

0 commit comments

Comments
 (0)