Skip to content

Commit bf5ba37

Browse files
committed
Swift: Hide InOutExpr
1 parent e54341a commit bf5ba37

File tree

7 files changed

+58
-121
lines changed

7 files changed

+58
-121
lines changed

swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,14 +1235,6 @@ module Exprs {
12351235
}
12361236
}
12371237

1238-
private class InOutTree extends AstStandardPostOrderTree {
1239-
override InOutExpr ast;
1240-
1241-
final override ControlFlowElement getChildElement(int i) {
1242-
i = 0 and result.asAstNode() = ast.getSubExpr().getFullyConverted()
1243-
}
1244-
}
1245-
12461238
private class SubscriptTree extends AstControlFlowTree {
12471239
override SubscriptExpr ast;
12481240

@@ -1749,7 +1741,7 @@ module Exprs {
17491741

17501742
module Conversions {
17511743
class ConversionOrIdentity =
1752-
Synth::TIdentityExpr or Synth::TExplicitCastExpr or Synth::TImplicitConversionExpr;
1744+
Synth::TIdentityExpr or Synth::TExplicitCastExpr or Synth::TImplicitConversionExpr or Synth::TInOutExpr;
17531745

17541746
abstract class ConversionOrIdentityTree extends AstStandardPostOrderTree {
17551747
ConversionOrIdentityTree() { ast instanceof ConversionOrIdentity }
@@ -1780,6 +1772,11 @@ module Exprs {
17801772

17811773
override predicate convertsFrom(Expr e) { ast.convertsFrom(e) }
17821774
}
1775+
1776+
private class InOutTree extends ConversionOrIdentityTree {
1777+
override InOutExpr ast;
1778+
override predicate convertsFrom(Expr e) { ast.convertsFrom(e) }
1779+
}
17831780
}
17841781
}
17851782

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ private module Cached {
112112
[
113113
any(Argument arg | modifiable(arg)).getExpr(), any(MemberRefExpr ref).getBase(),
114114
any(ApplyExpr apply).getQualifier(), any(TupleElementExpr te).getSubExpr(),
115-
any(SubscriptExpr se).getBase(), any(InOutExpr ioe).getSubExpr()
115+
any(SubscriptExpr se).getBase()
116116
])
117117
}
118118

@@ -709,7 +709,7 @@ predicate storeStep(Node node1, ContentSet c, Node node2) {
709709
node1.asExpr() = assign.getSource() and
710710
node2.(PostUpdateNode).getPreUpdateNode().asExpr() = subscript.getBase() and
711711
subscript = assign.getDest() and
712-
subscript.getBase().getType().(InOutType).getObjectType() instanceof ArrayType and
712+
subscript.getBase().getType() instanceof ArrayType and
713713
c.isSingleton(any(Content::ArrayContent ac))
714714
)
715715
or
@@ -785,7 +785,7 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
785785
exists(SubscriptExpr subscript |
786786
subscript.getBase() = node1.asExpr() and
787787
subscript = node2.asExpr() and
788-
subscript.getBase().getType().(InOutType).getObjectType() instanceof ArrayType and
788+
subscript.getBase().getType() instanceof ArrayType and
789789
c.isSingleton(any(Content::ArrayContent ac))
790790
)
791791
}

swift/ql/lib/codeql/swift/elements/expr/InOutExpr.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ private import codeql.swift.generated.expr.InOutExpr
22

33
class InOutExpr extends Generated::InOutExpr {
44
override string toString() { result = "&..." }
5+
6+
override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() }
57
}

swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Array.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ private import codeql.swift.dataflow.ExternalFlow
88
/**
99
* An instance of the `Array` type.
1010
*/
11-
class ArrayType extends BoundGenericType {
12-
ArrayType() { this.getName().matches("Array<%") }
11+
class ArrayType extends Type {
12+
ArrayType() { this.getName().matches("Array<%") or this.getName().matches("[%]") }
1313
}
1414

1515
/**

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

Lines changed: 45 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,22 @@ edges
1414
| test.swift:29:26:29:29 | y | test.swift:31:15:31:15 | y |
1515
| test.swift:35:12:35:19 | call to source() | test.swift:39:15:39:29 | call to callee_source() |
1616
| test.swift:43:19:43:26 | call to source() | test.swift:50:15:50:15 | t |
17-
| test.swift:53:1:56:1 | arg[return] | test.swift:61:22:61:23 | [post] &... |
17+
| test.swift:53:1:56:1 | arg[return] | test.swift:61:23:61:23 | [post] x |
1818
| test.swift:54:11:54:18 | call to source() | test.swift:53:1:56:1 | arg[return] |
19-
| test.swift:61:22:61:23 | [post] &... | test.swift:62:15:62:15 | x |
19+
| test.swift:61:23:61:23 | [post] x | test.swift:62:15:62:15 | x |
2020
| test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] |
21-
| test.swift:65:33:65:45 | arg2 | test.swift:65:1:70:1 | arg1[return] |
22-
| test.swift:73:18:73:25 | call to source() | test.swift:75:21:75:22 | &... |
21+
| test.swift:73:18:73:25 | call to source() | test.swift:75:22:75:22 | x |
2322
| test.swift:73:18:73:25 | call to source() | test.swift:76:15:76:15 | x |
24-
| test.swift:75:21:75:22 | &... | test.swift:65:16:65:28 | arg1 |
25-
| test.swift:75:21:75:22 | &... | test.swift:75:31:75:32 | [post] &... |
26-
| test.swift:75:21:75:22 | [post] &... | test.swift:75:21:75:22 | &... |
27-
| test.swift:75:21:75:22 | [post] &... | test.swift:76:15:76:15 | x |
28-
| test.swift:75:31:75:32 | &... | test.swift:65:33:65:45 | arg2 |
29-
| test.swift:75:31:75:32 | &... | test.swift:75:21:75:22 | [post] &... |
30-
| test.swift:75:31:75:32 | [post] &... | test.swift:75:31:75:32 | &... |
31-
| test.swift:75:31:75:32 | [post] &... | test.swift:77:15:77:15 | y |
32-
| test.swift:80:1:82:1 | arg[return] | test.swift:97:39:97:40 | [post] &... |
23+
| test.swift:75:22:75:22 | x | test.swift:65:16:65:28 | arg1 |
24+
| test.swift:75:22:75:22 | x | test.swift:75:32:75:32 | [post] y |
25+
| test.swift:75:32:75:32 | [post] y | test.swift:77:15:77:15 | y |
26+
| test.swift:80:1:82:1 | arg[return] | test.swift:97:40:97:40 | [post] x |
3327
| test.swift:81:11:81:18 | call to source() | test.swift:80:1:82:1 | arg[return] |
34-
| test.swift:84:1:91:1 | arg[return] | test.swift:104:40:104:41 | [post] &... |
28+
| test.swift:84:1:91:1 | arg[return] | test.swift:104:41:104:41 | [post] x |
3529
| test.swift:86:15:86:22 | call to source() | test.swift:84:1:91:1 | arg[return] |
3630
| test.swift:89:15:89:22 | call to source() | test.swift:84:1:91:1 | arg[return] |
37-
| test.swift:97:39:97:40 | [post] &... | test.swift:98:19:98:19 | x |
38-
| test.swift:104:40:104:41 | [post] &... | test.swift:105:19:105:19 | x |
31+
| test.swift:97:40:97:40 | [post] x | test.swift:98:19:98:19 | x |
32+
| test.swift:104:41:104:41 | [post] x | test.swift:105:19:105:19 | x |
3933
| test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg |
4034
| test.swift:113:14:113:19 | arg | test.swift:114:19:114:19 | arg |
4135
| test.swift:113:14:113:19 | arg | test.swift:114:19:114:19 | arg |
@@ -282,36 +276,29 @@ edges
282276
| test.swift:599:15:599:15 | array [Array element] | test.swift:598:13:598:22 | enter #keyPath(...) [Array element] |
283277
| test.swift:599:15:599:15 | array [Array element] | test.swift:599:15:599:31 | \\...[...] |
284278
| test.swift:618:13:618:20 | call to source() | test.swift:626:15:626:15 | y |
285-
| test.swift:628:9:628:16 | call to source() | test.swift:630:10:630:11 | &... |
279+
| test.swift:628:9:628:16 | call to source() | test.swift:630:11:630:11 | x |
286280
| test.swift:628:9:628:16 | call to source() | test.swift:631:15:631:15 | x |
287-
| test.swift:630:10:630:11 | &... | test.swift:630:14:630:15 | [post] &... |
288-
| test.swift:630:10:630:11 | [post] &... | test.swift:630:10:630:11 | &... |
289-
| test.swift:630:10:630:11 | [post] &... | test.swift:631:15:631:15 | x |
290-
| test.swift:630:14:630:15 | &... | test.swift:630:10:630:11 | [post] &... |
291-
| test.swift:630:14:630:15 | [post] &... | test.swift:630:14:630:15 | &... |
292-
| test.swift:630:14:630:15 | [post] &... | test.swift:632:15:632:15 | y |
293-
| test.swift:638:5:638:5 | [post] &... [Array element] | test.swift:639:15:639:15 | &... [Array element] |
294-
| test.swift:638:15:638:22 | call to source() | test.swift:638:5:638:5 | [post] &... [Array element] |
295-
| test.swift:639:15:639:15 | &... [Array element] | test.swift:639:15:639:21 | ...[...] |
296-
| test.swift:642:16:642:25 | [...] [Array element] | test.swift:643:15:643:15 | &... [Array element] |
281+
| test.swift:630:11:630:11 | x | test.swift:630:15:630:15 | [post] y |
282+
| test.swift:630:15:630:15 | [post] y | test.swift:632:15:632:15 | y |
283+
| test.swift:638:5:638:5 | [post] arr1 [Array element] | test.swift:639:15:639:15 | arr1 [Array element] |
284+
| test.swift:638:15:638:22 | call to source() | test.swift:638:5:638:5 | [post] arr1 [Array element] |
285+
| test.swift:639:15:639:15 | arr1 [Array element] | test.swift:639:15:639:21 | ...[...] |
286+
| test.swift:642:16:642:25 | [...] [Array element] | test.swift:643:15:643:15 | arr2 [Array element] |
297287
| test.swift:642:17:642:24 | call to source() | test.swift:642:16:642:25 | [...] [Array element] |
298-
| test.swift:643:15:643:15 | &... [Array element] | test.swift:643:15:643:21 | ...[...] |
299-
| test.swift:645:18:645:29 | [...] [Array element, Array element] | test.swift:647:15:647:15 | &... [Array element, Array element] |
288+
| test.swift:643:15:643:15 | arr2 [Array element] | test.swift:643:15:643:21 | ...[...] |
289+
| test.swift:645:18:645:29 | [...] [Array element, Array element] | test.swift:647:15:647:15 | matrix [Array element, Array element] |
300290
| test.swift:645:19:645:28 | [...] [Array element] | test.swift:645:18:645:29 | [...] [Array element, Array element] |
301291
| test.swift:645:20:645:27 | call to source() | test.swift:645:19:645:28 | [...] [Array element] |
302-
| test.swift:647:15:647:15 | &... [Array element, Array element] | test.swift:647:15:647:23 | ...[...] [Array element] |
303-
| test.swift:647:15:647:23 | &... [Array element] | test.swift:647:15:647:26 | ...[...] |
304-
| test.swift:647:15:647:23 | ...[...] [Array element] | test.swift:647:15:647:23 | &... [Array element] |
305-
| test.swift:650:5:650:5 | [post] &... [Array element, Array element] | test.swift:651:15:651:15 | &... [Array element, Array element] |
306-
| test.swift:650:5:650:14 | [post] &... [Array element] | test.swift:650:5:650:14 | [post] getter for ...[...] [Array element] |
307-
| test.swift:650:5:650:14 | [post] getter for ...[...] [Array element] | test.swift:650:5:650:5 | [post] &... [Array element, Array element] |
308-
| test.swift:650:21:650:28 | call to source() | test.swift:650:5:650:14 | [post] &... [Array element] |
309-
| test.swift:651:15:651:15 | &... [Array element, Array element] | test.swift:651:15:651:24 | ...[...] [Array element] |
310-
| test.swift:651:15:651:24 | &... [Array element] | test.swift:651:15:651:27 | ...[...] |
311-
| test.swift:651:15:651:24 | ...[...] [Array element] | test.swift:651:15:651:24 | &... [Array element] |
312-
| test.swift:662:5:662:5 | [post] &... [Array element] | test.swift:663:15:663:15 | &... [Array element] |
313-
| test.swift:662:17:662:24 | call to source() | test.swift:662:5:662:5 | [post] &... [Array element] |
314-
| test.swift:663:15:663:15 | &... [Array element] | test.swift:663:15:663:21 | ...[...] |
292+
| test.swift:647:15:647:15 | matrix [Array element, Array element] | test.swift:647:15:647:23 | ...[...] [Array element] |
293+
| test.swift:647:15:647:23 | ...[...] [Array element] | test.swift:647:15:647:26 | ...[...] |
294+
| test.swift:650:5:650:5 | [post] matrix2 [Array element, Array element] | test.swift:651:15:651:15 | matrix2 [Array element, Array element] |
295+
| test.swift:650:5:650:14 | [post] getter for ...[...] [Array element] | test.swift:650:5:650:5 | [post] matrix2 [Array element, Array element] |
296+
| test.swift:650:21:650:28 | call to source() | test.swift:650:5:650:14 | [post] getter for ...[...] [Array element] |
297+
| test.swift:651:15:651:15 | matrix2 [Array element, Array element] | test.swift:651:15:651:24 | ...[...] [Array element] |
298+
| test.swift:651:15:651:24 | ...[...] [Array element] | test.swift:651:15:651:27 | ...[...] |
299+
| test.swift:662:5:662:5 | [post] arr6 [Array element] | test.swift:663:15:663:15 | arr6 [Array element] |
300+
| test.swift:662:17:662:24 | call to source() | test.swift:662:5:662:5 | [post] arr6 [Array element] |
301+
| test.swift:663:15:663:15 | arr6 [Array element] | test.swift:663:15:663:21 | ...[...] |
315302
nodes
316303
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
317304
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -341,27 +328,23 @@ nodes
341328
| test.swift:50:15:50:15 | t | semmle.label | t |
342329
| test.swift:53:1:56:1 | arg[return] | semmle.label | arg[return] |
343330
| test.swift:54:11:54:18 | call to source() | semmle.label | call to source() |
344-
| test.swift:61:22:61:23 | [post] &... | semmle.label | [post] &... |
331+
| test.swift:61:23:61:23 | [post] x | semmle.label | [post] x |
345332
| test.swift:62:15:62:15 | x | semmle.label | x |
346-
| test.swift:65:1:70:1 | arg1[return] | semmle.label | arg1[return] |
347333
| test.swift:65:1:70:1 | arg2[return] | semmle.label | arg2[return] |
348334
| test.swift:65:16:65:28 | arg1 | semmle.label | arg1 |
349-
| test.swift:65:33:65:45 | arg2 | semmle.label | arg2 |
350335
| test.swift:73:18:73:25 | call to source() | semmle.label | call to source() |
351-
| test.swift:75:21:75:22 | &... | semmle.label | &... |
352-
| test.swift:75:21:75:22 | [post] &... | semmle.label | [post] &... |
353-
| test.swift:75:31:75:32 | &... | semmle.label | &... |
354-
| test.swift:75:31:75:32 | [post] &... | semmle.label | [post] &... |
336+
| test.swift:75:22:75:22 | x | semmle.label | x |
337+
| test.swift:75:32:75:32 | [post] y | semmle.label | [post] y |
355338
| test.swift:76:15:76:15 | x | semmle.label | x |
356339
| test.swift:77:15:77:15 | y | semmle.label | y |
357340
| test.swift:80:1:82:1 | arg[return] | semmle.label | arg[return] |
358341
| test.swift:81:11:81:18 | call to source() | semmle.label | call to source() |
359342
| test.swift:84:1:91:1 | arg[return] | semmle.label | arg[return] |
360343
| test.swift:86:15:86:22 | call to source() | semmle.label | call to source() |
361344
| test.swift:89:15:89:22 | call to source() | semmle.label | call to source() |
362-
| test.swift:97:39:97:40 | [post] &... | semmle.label | [post] &... |
345+
| test.swift:97:40:97:40 | [post] x | semmle.label | [post] x |
363346
| test.swift:98:19:98:19 | x | semmle.label | x |
364-
| test.swift:104:40:104:41 | [post] &... | semmle.label | [post] &... |
347+
| test.swift:104:41:104:41 | [post] x | semmle.label | [post] x |
365348
| test.swift:105:19:105:19 | x | semmle.label | x |
366349
| test.swift:109:9:109:14 | arg | semmle.label | arg |
367350
| test.swift:110:12:110:12 | arg | semmle.label | arg |
@@ -619,42 +602,36 @@ nodes
619602
| test.swift:618:13:618:20 | call to source() | semmle.label | call to source() |
620603
| test.swift:626:15:626:15 | y | semmle.label | y |
621604
| test.swift:628:9:628:16 | call to source() | semmle.label | call to source() |
622-
| test.swift:630:10:630:11 | &... | semmle.label | &... |
623-
| test.swift:630:10:630:11 | [post] &... | semmle.label | [post] &... |
624-
| test.swift:630:14:630:15 | &... | semmle.label | &... |
625-
| test.swift:630:14:630:15 | [post] &... | semmle.label | [post] &... |
605+
| test.swift:630:11:630:11 | x | semmle.label | x |
606+
| test.swift:630:15:630:15 | [post] y | semmle.label | [post] y |
626607
| test.swift:631:15:631:15 | x | semmle.label | x |
627608
| test.swift:632:15:632:15 | y | semmle.label | y |
628-
| test.swift:638:5:638:5 | [post] &... [Array element] | semmle.label | [post] &... [Array element] |
609+
| test.swift:638:5:638:5 | [post] arr1 [Array element] | semmle.label | [post] arr1 [Array element] |
629610
| test.swift:638:15:638:22 | call to source() | semmle.label | call to source() |
630-
| test.swift:639:15:639:15 | &... [Array element] | semmle.label | &... [Array element] |
611+
| test.swift:639:15:639:15 | arr1 [Array element] | semmle.label | arr1 [Array element] |
631612
| test.swift:639:15:639:21 | ...[...] | semmle.label | ...[...] |
632613
| test.swift:642:16:642:25 | [...] [Array element] | semmle.label | [...] [Array element] |
633614
| test.swift:642:17:642:24 | call to source() | semmle.label | call to source() |
634-
| test.swift:643:15:643:15 | &... [Array element] | semmle.label | &... [Array element] |
615+
| test.swift:643:15:643:15 | arr2 [Array element] | semmle.label | arr2 [Array element] |
635616
| test.swift:643:15:643:21 | ...[...] | semmle.label | ...[...] |
636617
| test.swift:645:18:645:29 | [...] [Array element, Array element] | semmle.label | [...] [Array element, Array element] |
637618
| test.swift:645:19:645:28 | [...] [Array element] | semmle.label | [...] [Array element] |
638619
| test.swift:645:20:645:27 | call to source() | semmle.label | call to source() |
639-
| test.swift:647:15:647:15 | &... [Array element, Array element] | semmle.label | &... [Array element, Array element] |
640-
| test.swift:647:15:647:23 | &... [Array element] | semmle.label | &... [Array element] |
620+
| test.swift:647:15:647:15 | matrix [Array element, Array element] | semmle.label | matrix [Array element, Array element] |
641621
| test.swift:647:15:647:23 | ...[...] [Array element] | semmle.label | ...[...] [Array element] |
642622
| test.swift:647:15:647:26 | ...[...] | semmle.label | ...[...] |
643-
| test.swift:650:5:650:5 | [post] &... [Array element, Array element] | semmle.label | [post] &... [Array element, Array element] |
644-
| test.swift:650:5:650:14 | [post] &... [Array element] | semmle.label | [post] &... [Array element] |
623+
| test.swift:650:5:650:5 | [post] matrix2 [Array element, Array element] | semmle.label | [post] matrix2 [Array element, Array element] |
645624
| test.swift:650:5:650:14 | [post] getter for ...[...] [Array element] | semmle.label | [post] getter for ...[...] [Array element] |
646625
| test.swift:650:21:650:28 | call to source() | semmle.label | call to source() |
647-
| test.swift:651:15:651:15 | &... [Array element, Array element] | semmle.label | &... [Array element, Array element] |
648-
| test.swift:651:15:651:24 | &... [Array element] | semmle.label | &... [Array element] |
626+
| test.swift:651:15:651:15 | matrix2 [Array element, Array element] | semmle.label | matrix2 [Array element, Array element] |
649627
| test.swift:651:15:651:24 | ...[...] [Array element] | semmle.label | ...[...] [Array element] |
650628
| test.swift:651:15:651:27 | ...[...] | semmle.label | ...[...] |
651-
| test.swift:662:5:662:5 | [post] &... [Array element] | semmle.label | [post] &... [Array element] |
629+
| test.swift:662:5:662:5 | [post] arr6 [Array element] | semmle.label | [post] arr6 [Array element] |
652630
| test.swift:662:17:662:24 | call to source() | semmle.label | call to source() |
653-
| test.swift:663:15:663:15 | &... [Array element] | semmle.label | &... [Array element] |
631+
| test.swift:663:15:663:15 | arr6 [Array element] | semmle.label | arr6 [Array element] |
654632
| test.swift:663:15:663:21 | ...[...] | semmle.label | ...[...] |
655633
subpaths
656-
| test.swift:75:21:75:22 | &... | test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | test.swift:75:31:75:32 | [post] &... |
657-
| test.swift:75:31:75:32 | &... | test.swift:65:33:65:45 | arg2 | test.swift:65:1:70:1 | arg1[return] | test.swift:75:21:75:22 | [post] &... |
634+
| test.swift:75:22:75:22 | x | test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | test.swift:75:32:75:32 | [post] y |
658635
| test.swift:114:19:114:19 | arg | test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg | test.swift:114:12:114:22 | call to ... |
659636
| test.swift:114:19:114:19 | arg | test.swift:123:10:123:13 | i | test.swift:124:16:124:16 | i | test.swift:114:12:114:22 | call to ... |
660637
| test.swift:119:31:119:31 | x | test.swift:113:14:113:19 | arg | test.swift:114:12:114:22 | call to ... | test.swift:119:18:119:44 | call to forward(arg:lambda:) |
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
failures
22
testFailures
3-
| test.swift:651:15:651:27 | ...[...] | Fixed missing result:flow=650 |

0 commit comments

Comments
 (0)