Skip to content

Commit a021112

Browse files
committed
unified: Add flow through 'unowned'
1 parent 007849c commit a021112

4 files changed

Lines changed: 39 additions & 0 deletions

File tree

‎unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ private class SwiftDataFlowPlugin extends DataFlowPlugin {
7373
node1.isResultValue(expr.getOperand()) and
7474
step.storeName("some.0") and
7575
node2.isResultValue(expr)
76+
or
77+
// `[unowned x]` is translated to `[x = unowned x]`
78+
expr.getOperator().(PrefixOperator).getValue() = "unowned" and
79+
node1.isResultValue(expr.getOperand()) and
80+
step.value() and
81+
node2.isResultValue(expr)
7682
)
7783
}
7884
}

‎unified/ql/test/library-tests/dataflow/capture.swift‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,13 @@ class C {
178178
}
179179
closure()
180180
}
181+
182+
func capture_unowned_self() {
183+
x = source("C.4")
184+
let closure = { [unowned self] in
185+
sink(self.x) // $ hasValueFlow=C.4
186+
sink(x) // $ hasValueFlow=C.4
187+
}
188+
closure()
189+
}
181190
}

‎unified/ql/test/library-tests/dataflow/test.expected‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ edges
123123
| capture.swift:175:23:175:26 | self [x] | capture.swift:177:18:177:18 | x | provenance | |
124124
| capture.swift:176:18:176:21 | self [x] | capture.swift:176:18:176:23 | ... .x | provenance | |
125125
| capture.swift:179:9:179:15 | closure [self, some.0, x] | capture.swift:175:23:175:26 | self [some.0, x] | provenance | |
126+
| capture.swift:183:9:183:9 | x | capture.swift:184:34:184:37 | self [x] | provenance | |
127+
| capture.swift:183:13:183:25 | source(...) | capture.swift:183:9:183:9 | x | provenance | |
128+
| capture.swift:184:34:184:37 | self [x] | capture.swift:184:34:184:37 | self [x] | provenance | |
129+
| capture.swift:184:34:184:37 | self [x] | capture.swift:188:9:188:15 | closure [self, x] | provenance | |
130+
| capture.swift:185:18:185:21 | self [x] | capture.swift:185:18:185:23 | ... .x | provenance | |
131+
| capture.swift:188:9:188:15 | closure [self, x] | capture.swift:185:18:185:21 | self [x] | provenance | |
132+
| capture.swift:188:9:188:15 | closure [self, x] | capture.swift:186:18:186:18 | x | provenance | |
126133
| enums.swift:12:9:12:9 | e [case1.0] | enums.swift:14:12:14:12 | e [case1.0] | provenance | |
127134
| enums.swift:12:13:12:35 | ... .case1(...) [case1.0] | enums.swift:12:9:12:9 | e [case1.0] | provenance | |
128135
| enums.swift:12:21:12:34 | source(...) | enums.swift:12:13:12:35 | ... .case1(...) [case1.0] | provenance | |
@@ -517,6 +524,14 @@ nodes
517524
| capture.swift:176:18:176:23 | ... .x | semmle.label | ... .x |
518525
| capture.swift:177:18:177:18 | x | semmle.label | x |
519526
| capture.swift:179:9:179:15 | closure [self, some.0, x] | semmle.label | closure [self, some.0, x] |
527+
| capture.swift:183:9:183:9 | x | semmle.label | x |
528+
| capture.swift:183:13:183:25 | source(...) | semmle.label | source(...) |
529+
| capture.swift:184:34:184:37 | self [x] | semmle.label | self [x] |
530+
| capture.swift:184:34:184:37 | self [x] | semmle.label | self [x] |
531+
| capture.swift:185:18:185:21 | self [x] | semmle.label | self [x] |
532+
| capture.swift:185:18:185:23 | ... .x | semmle.label | ... .x |
533+
| capture.swift:186:18:186:18 | x | semmle.label | x |
534+
| capture.swift:188:9:188:15 | closure [self, x] | semmle.label | closure [self, x] |
520535
| enums.swift:12:9:12:9 | e [case1.0] | semmle.label | e [case1.0] |
521536
| enums.swift:12:13:12:35 | ... .case1(...) [case1.0] | semmle.label | ... .case1(...) [case1.0] |
522537
| enums.swift:12:21:12:34 | source(...) | semmle.label | source(...) |
@@ -872,6 +887,8 @@ testFailures
872887
| capture.swift:167:18:167:18 | x | capture.swift:164:13:164:25 | source(...) | capture.swift:167:18:167:18 | x | $@ | capture.swift:164:13:164:25 | source(...) | source(...) |
873888
| capture.swift:176:18:176:23 | ... .x | capture.swift:173:13:173:25 | source(...) | capture.swift:176:18:176:23 | ... .x | $@ | capture.swift:173:13:173:25 | source(...) | source(...) |
874889
| capture.swift:177:18:177:18 | x | capture.swift:173:13:173:25 | source(...) | capture.swift:177:18:177:18 | x | $@ | capture.swift:173:13:173:25 | source(...) | source(...) |
890+
| capture.swift:185:18:185:23 | ... .x | capture.swift:183:13:183:25 | source(...) | capture.swift:185:18:185:23 | ... .x | $@ | capture.swift:183:13:183:25 | source(...) | source(...) |
891+
| capture.swift:186:18:186:18 | x | capture.swift:183:13:183:25 | source(...) | capture.swift:186:18:186:18 | x | $@ | capture.swift:183:13:183:25 | source(...) | source(...) |
875892
| enums.swift:16:14:16:14 | x | enums.swift:12:21:12:34 | source(...) | enums.swift:16:14:16:14 | x | $@ | enums.swift:12:21:12:34 | source(...) | source(...) |
876893
| enums.swift:27:14:27:14 | x | enums.swift:23:21:23:34 | source(...) | enums.swift:27:14:27:14 | x | $@ | enums.swift:23:21:23:34 | source(...) | source(...) |
877894
| enums.swift:36:10:36:10 | x | enums.swift:34:21:34:34 | source(...) | enums.swift:36:10:36:10 | x | $@ | enums.swift:34:21:34:34 | source(...) | source(...) |

‎unified/ql/test/library-tests/local-name-binding/self_access.swift‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,11 @@ class C {
3030
print(instanceField) // $ access=instanceField implicit-qualifier=guarded.self
3131
}
3232
}
33+
34+
func t5() { // implicit-self=t5.self
35+
foo(123) { [unowned self] in // $ captured=unowned.self access=t5.self // name=unowned.self
36+
print(self) // $ access=unowned.self
37+
print(instanceField) // $ access=instanceField implicit-qualifier=unowned.self
38+
}
39+
}
3340
}

0 commit comments

Comments
 (0)