Skip to content

Commit 56b49a4

Browse files
committed
Swift: Add a closure flow step from the right-hand side of variable declarations to the underlying pattern.
1 parent 3d5098a commit 56b49a4

File tree

3 files changed

+8
-3
lines changed

3 files changed

+8
-3
lines changed

swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ private module Cached {
151151
[
152152
any(Argument arg | modifiable(arg)).getExpr(), any(MemberRefExpr ref).getBase(),
153153
any(ApplyExpr apply).getQualifier(), any(TupleElementExpr te).getSubExpr(),
154-
any(SubscriptExpr se).getBase()
154+
any(SubscriptExpr se).getBase(),
155+
any(ApplyExpr apply | not exists(apply.getStaticTarget())).getFunction()
155156
])
156157
} or
157158
TDictionarySubscriptNode(SubscriptExpr e) {
@@ -838,13 +839,15 @@ private predicate simpleAstFlowStep(Expr e1, Expr e2) {
838839
e2.(ArrayExpr).getAnElement() = e1
839840
}
840841

841-
private predicate closureFlowStep(Expr e1, Expr e2) {
842+
private predicate closureFlowStep(CaptureInput::Expr e1, CaptureInput::Expr e2) {
842843
simpleAstFlowStep(e1, e2)
843844
or
844845
exists(Ssa::WriteDefinition def |
845846
def.getARead().getNode().asAstNode() = e2 and
846847
def.assigns(any(CfgNode cfg | cfg.getNode().asAstNode() = e1))
847848
)
849+
or
850+
e2.(Pattern).getImmediateMatchingExpr() = e1
848851
}
849852

850853
private module CaptureInput implements VariableCapture::InputSig {

swift/ql/test/library-tests/dataflow/capture/closures.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,5 +156,5 @@ func sideEffects() {
156156
var x = 0
157157
var f = { () in x = source("sideEffects", 1) }
158158
f()
159-
sink(x) // $ MISSING: hasValueFlow=sideEffects
159+
sink(x) // $ hasValueFlow=sideEffects
160160
}

swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,14 @@
131131
| test.swift:147:9:147:9 | SSA def(lambdaSource) | test.swift:151:15:151:15 | lambdaSource |
132132
| test.swift:147:9:147:9 | lambdaSource | test.swift:147:9:147:9 | SSA def(lambdaSource) |
133133
| test.swift:147:24:150:5 | { ... } | test.swift:147:9:147:9 | lambdaSource |
134+
| test.swift:151:15:151:15 | [post] lambdaSource | test.swift:159:16:159:16 | lambdaSource |
134135
| test.swift:151:15:151:15 | lambdaSource | test.swift:159:16:159:16 | lambdaSource |
135136
| test.swift:153:9:153:9 | SSA def(lambdaSink) | test.swift:157:5:157:5 | lambdaSink |
136137
| test.swift:153:9:153:9 | lambdaSink | test.swift:153:9:153:9 | SSA def(lambdaSink) |
137138
| test.swift:153:22:156:5 | { ... } | test.swift:153:9:153:9 | lambdaSink |
138139
| test.swift:154:10:154:13 | SSA def(i) | test.swift:155:19:155:19 | i |
139140
| test.swift:154:10:154:13 | i | test.swift:154:10:154:13 | SSA def(i) |
141+
| test.swift:157:5:157:5 | [post] lambdaSink | test.swift:159:5:159:5 | lambdaSink |
140142
| test.swift:157:5:157:5 | lambdaSink | test.swift:159:5:159:5 | lambdaSink |
141143
| test.swift:162:7:162:7 | SSA def(self) | test.swift:162:7:162:7 | self[return] |
142144
| test.swift:162:7:162:7 | self | test.swift:162:7:162:7 | SSA def(self) |

0 commit comments

Comments
 (0)