Skip to content

Commit 231b0fc

Browse files
committed
Swift: Add more tests.
1 parent f9d5e56 commit 231b0fc

File tree

3 files changed

+116
-50
lines changed

3 files changed

+116
-50
lines changed

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

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -251,26 +251,31 @@ edges
251251
| test.swift:568:5:568:5 | [post] self [x] : | test.swift:567:3:569:3 | self[return] [x] : |
252252
| test.swift:568:14:568:14 | x : | test.swift:568:5:568:5 | [post] self [x] : |
253253
| test.swift:573:11:573:24 | call to S.init(x:) [x] : | test.swift:575:13:575:13 | s [x] : |
254+
| test.swift:573:11:573:24 | call to S.init(x:) [x] : | test.swift:578:13:578:13 | s [x] : |
254255
| test.swift:573:16:573:23 | call to source() : | test.swift:567:8:567:11 | x : |
255256
| test.swift:573:16:573:23 | call to source() : | test.swift:573:11:573:24 | call to S.init(x:) [x] : |
256257
| test.swift:574:11:574:14 | enter #keyPath(...) [x] : | test.swift:574:14:574:14 | KeyPathComponent [x] : |
257258
| test.swift:574:14:574:14 | KeyPathComponent [x] : | test.swift:574:11:574:14 | exit #keyPath(...) : |
258259
| test.swift:575:13:575:13 | s [x] : | test.swift:574:11:574:14 | enter #keyPath(...) [x] : |
259260
| test.swift:575:13:575:13 | s [x] : | test.swift:575:13:575:25 | \\...[...] |
260-
| test.swift:581:8:581:11 | s [x] : | test.swift:582:14:582:14 | s [x] : |
261-
| test.swift:582:5:582:5 | [post] self [s, x] : | test.swift:581:3:583:3 | self[return] [s, x] : |
262-
| test.swift:582:14:582:14 | s [x] : | test.swift:582:5:582:5 | [post] self [s, x] : |
263-
| test.swift:587:11:587:24 | call to S.init(x:) [x] : | test.swift:588:18:588:18 | s [x] : |
264-
| test.swift:587:16:587:23 | call to source() : | test.swift:567:8:567:11 | x : |
265-
| test.swift:587:16:587:23 | call to source() : | test.swift:587:11:587:24 | call to S.init(x:) [x] : |
266-
| test.swift:588:12:588:19 | call to S2.init(s:) [s, x] : | test.swift:590:13:590:13 | s2 [s, x] : |
267-
| test.swift:588:18:588:18 | s [x] : | test.swift:581:8:581:11 | s [x] : |
268-
| test.swift:588:18:588:18 | s [x] : | test.swift:588:12:588:19 | call to S2.init(s:) [s, x] : |
269-
| test.swift:589:11:589:17 | enter #keyPath(...) [s, x] : | test.swift:589:15:589:15 | KeyPathComponent [s, x] : |
270-
| test.swift:589:15:589:15 | KeyPathComponent [s, x] : | test.swift:589:17:589:17 | KeyPathComponent [x] : |
271-
| test.swift:589:17:589:17 | KeyPathComponent [x] : | test.swift:589:11:589:17 | exit #keyPath(...) : |
272-
| test.swift:590:13:590:13 | s2 [s, x] : | test.swift:589:11:589:17 | enter #keyPath(...) [s, x] : |
273-
| test.swift:590:13:590:13 | s2 [s, x] : | test.swift:590:13:590:26 | \\...[...] |
261+
| test.swift:577:36:577:38 | enter #keyPath(...) [x] : | test.swift:577:38:577:38 | KeyPathComponent [x] : |
262+
| test.swift:577:38:577:38 | KeyPathComponent [x] : | test.swift:577:36:577:38 | exit #keyPath(...) : |
263+
| test.swift:578:13:578:13 | s [x] : | test.swift:577:36:577:38 | enter #keyPath(...) [x] : |
264+
| test.swift:578:13:578:13 | s [x] : | test.swift:578:13:578:32 | \\...[...] |
265+
| test.swift:584:8:584:11 | s [x] : | test.swift:585:14:585:14 | s [x] : |
266+
| test.swift:585:5:585:5 | [post] self [s, x] : | test.swift:584:3:586:3 | self[return] [s, x] : |
267+
| test.swift:585:14:585:14 | s [x] : | test.swift:585:5:585:5 | [post] self [s, x] : |
268+
| test.swift:590:11:590:24 | call to S.init(x:) [x] : | test.swift:591:18:591:18 | s [x] : |
269+
| test.swift:590:16:590:23 | call to source() : | test.swift:567:8:567:11 | x : |
270+
| test.swift:590:16:590:23 | call to source() : | test.swift:590:11:590:24 | call to S.init(x:) [x] : |
271+
| test.swift:591:12:591:19 | call to S2.init(s:) [s, x] : | test.swift:593:13:593:13 | s2 [s, x] : |
272+
| test.swift:591:18:591:18 | s [x] : | test.swift:584:8:584:11 | s [x] : |
273+
| test.swift:591:18:591:18 | s [x] : | test.swift:591:12:591:19 | call to S2.init(s:) [s, x] : |
274+
| test.swift:592:11:592:17 | enter #keyPath(...) [s, x] : | test.swift:592:15:592:15 | KeyPathComponent [s, x] : |
275+
| test.swift:592:15:592:15 | KeyPathComponent [s, x] : | test.swift:592:17:592:17 | KeyPathComponent [x] : |
276+
| test.swift:592:17:592:17 | KeyPathComponent [x] : | test.swift:592:11:592:17 | exit #keyPath(...) : |
277+
| test.swift:593:13:593:13 | s2 [s, x] : | test.swift:592:11:592:17 | enter #keyPath(...) [s, x] : |
278+
| test.swift:593:13:593:13 | s2 [s, x] : | test.swift:593:13:593:26 | \\...[...] |
274279
nodes
275280
| file://:0:0:0:0 | .a [x] : | semmle.label | .a [x] : |
276281
| file://:0:0:0:0 | .str : | semmle.label | .str : |
@@ -549,20 +554,25 @@ nodes
549554
| test.swift:574:14:574:14 | KeyPathComponent [x] : | semmle.label | KeyPathComponent [x] : |
550555
| test.swift:575:13:575:13 | s [x] : | semmle.label | s [x] : |
551556
| test.swift:575:13:575:25 | \\...[...] | semmle.label | \\...[...] |
552-
| test.swift:581:3:583:3 | self[return] [s, x] : | semmle.label | self[return] [s, x] : |
553-
| test.swift:581:8:581:11 | s [x] : | semmle.label | s [x] : |
554-
| test.swift:582:5:582:5 | [post] self [s, x] : | semmle.label | [post] self [s, x] : |
555-
| test.swift:582:14:582:14 | s [x] : | semmle.label | s [x] : |
556-
| test.swift:587:11:587:24 | call to S.init(x:) [x] : | semmle.label | call to S.init(x:) [x] : |
557-
| test.swift:587:16:587:23 | call to source() : | semmle.label | call to source() : |
558-
| test.swift:588:12:588:19 | call to S2.init(s:) [s, x] : | semmle.label | call to S2.init(s:) [s, x] : |
559-
| test.swift:588:18:588:18 | s [x] : | semmle.label | s [x] : |
560-
| test.swift:589:11:589:17 | enter #keyPath(...) [s, x] : | semmle.label | enter #keyPath(...) [s, x] : |
561-
| test.swift:589:11:589:17 | exit #keyPath(...) : | semmle.label | exit #keyPath(...) : |
562-
| test.swift:589:15:589:15 | KeyPathComponent [s, x] : | semmle.label | KeyPathComponent [s, x] : |
563-
| test.swift:589:17:589:17 | KeyPathComponent [x] : | semmle.label | KeyPathComponent [x] : |
564-
| test.swift:590:13:590:13 | s2 [s, x] : | semmle.label | s2 [s, x] : |
565-
| test.swift:590:13:590:26 | \\...[...] | semmle.label | \\...[...] |
557+
| test.swift:577:36:577:38 | enter #keyPath(...) [x] : | semmle.label | enter #keyPath(...) [x] : |
558+
| test.swift:577:36:577:38 | exit #keyPath(...) : | semmle.label | exit #keyPath(...) : |
559+
| test.swift:577:38:577:38 | KeyPathComponent [x] : | semmle.label | KeyPathComponent [x] : |
560+
| test.swift:578:13:578:13 | s [x] : | semmle.label | s [x] : |
561+
| test.swift:578:13:578:32 | \\...[...] | semmle.label | \\...[...] |
562+
| test.swift:584:3:586:3 | self[return] [s, x] : | semmle.label | self[return] [s, x] : |
563+
| test.swift:584:8:584:11 | s [x] : | semmle.label | s [x] : |
564+
| test.swift:585:5:585:5 | [post] self [s, x] : | semmle.label | [post] self [s, x] : |
565+
| test.swift:585:14:585:14 | s [x] : | semmle.label | s [x] : |
566+
| test.swift:590:11:590:24 | call to S.init(x:) [x] : | semmle.label | call to S.init(x:) [x] : |
567+
| test.swift:590:16:590:23 | call to source() : | semmle.label | call to source() : |
568+
| test.swift:591:12:591:19 | call to S2.init(s:) [s, x] : | semmle.label | call to S2.init(s:) [s, x] : |
569+
| test.swift:591:18:591:18 | s [x] : | semmle.label | s [x] : |
570+
| test.swift:592:11:592:17 | enter #keyPath(...) [s, x] : | semmle.label | enter #keyPath(...) [s, x] : |
571+
| test.swift:592:11:592:17 | exit #keyPath(...) : | semmle.label | exit #keyPath(...) : |
572+
| test.swift:592:15:592:15 | KeyPathComponent [s, x] : | semmle.label | KeyPathComponent [s, x] : |
573+
| test.swift:592:17:592:17 | KeyPathComponent [x] : | semmle.label | KeyPathComponent [x] : |
574+
| test.swift:593:13:593:13 | s2 [s, x] : | semmle.label | s2 [s, x] : |
575+
| test.swift:593:13:593:26 | \\...[...] | semmle.label | \\...[...] |
566576
subpaths
567577
| 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] &... : |
568578
| 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 ... : |
@@ -602,9 +612,10 @@ subpaths
602612
| test.swift:550:13:550:41 | call to Self.init(contentsOfFile:) [str] : | test.swift:535:9:535:9 | self [str] : | file://:0:0:0:0 | .str : | test.swift:550:13:550:43 | .str |
603613
| test.swift:573:16:573:23 | call to source() : | test.swift:567:8:567:11 | x : | test.swift:567:3:569:3 | self[return] [x] : | test.swift:573:11:573:24 | call to S.init(x:) [x] : |
604614
| test.swift:575:13:575:13 | s [x] : | test.swift:574:11:574:14 | enter #keyPath(...) [x] : | test.swift:574:11:574:14 | exit #keyPath(...) : | test.swift:575:13:575:25 | \\...[...] |
605-
| test.swift:587:16:587:23 | call to source() : | test.swift:567:8:567:11 | x : | test.swift:567:3:569:3 | self[return] [x] : | test.swift:587:11:587:24 | call to S.init(x:) [x] : |
606-
| test.swift:588:18:588:18 | s [x] : | test.swift:581:8:581:11 | s [x] : | test.swift:581:3:583:3 | self[return] [s, x] : | test.swift:588:12:588:19 | call to S2.init(s:) [s, x] : |
607-
| test.swift:590:13:590:13 | s2 [s, x] : | test.swift:589:11:589:17 | enter #keyPath(...) [s, x] : | test.swift:589:11:589:17 | exit #keyPath(...) : | test.swift:590:13:590:26 | \\...[...] |
615+
| test.swift:578:13:578:13 | s [x] : | test.swift:577:36:577:38 | enter #keyPath(...) [x] : | test.swift:577:36:577:38 | exit #keyPath(...) : | test.swift:578:13:578:32 | \\...[...] |
616+
| test.swift:590:16:590:23 | call to source() : | test.swift:567:8:567:11 | x : | test.swift:567:3:569:3 | self[return] [x] : | test.swift:590:11:590:24 | call to S.init(x:) [x] : |
617+
| test.swift:591:18:591:18 | s [x] : | test.swift:584:8:584:11 | s [x] : | test.swift:584:3:586:3 | self[return] [s, x] : | test.swift:591:12:591:19 | call to S2.init(s:) [s, x] : |
618+
| test.swift:593:13:593:13 | s2 [s, x] : | test.swift:592:11:592:17 | enter #keyPath(...) [s, x] : | test.swift:592:11:592:17 | exit #keyPath(...) : | test.swift:593:13:593:26 | \\...[...] |
608619
#select
609620
| test.swift:7:15:7:15 | t1 | test.swift:6:19:6:26 | call to source() : | test.swift:7:15:7:15 | t1 | result |
610621
| test.swift:9:15:9:15 | t1 | test.swift:6:19:6:26 | call to source() : | test.swift:9:15:9:15 | t1 | result |
@@ -676,4 +687,5 @@ subpaths
676687
| test.swift:549:13:549:35 | .str | test.swift:549:24:549:32 | call to source3() : | test.swift:549:13:549:35 | .str | result |
677688
| test.swift:550:13:550:43 | .str | test.swift:543:20:543:28 | call to source3() : | test.swift:550:13:550:43 | .str | result |
678689
| test.swift:575:13:575:25 | \\...[...] | test.swift:573:16:573:23 | call to source() : | test.swift:575:13:575:25 | \\...[...] | result |
679-
| test.swift:590:13:590:26 | \\...[...] | test.swift:587:16:587:23 | call to source() : | test.swift:590:13:590:26 | \\...[...] | result |
690+
| test.swift:578:13:578:32 | \\...[...] | test.swift:573:16:573:23 | call to source() : | test.swift:578:13:578:32 | \\...[...] | result |
691+
| test.swift:593:13:593:26 | \\...[...] | test.swift:590:16:590:23 | call to source() : | test.swift:593:13:593:26 | \\...[...] | result |

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

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -615,20 +615,50 @@
615615
| test.swift:574:7:574:7 | f | test.swift:574:7:574:7 | SSA def(f) |
616616
| test.swift:574:11:574:14 | #keyPath(...) | test.swift:574:7:574:7 | f |
617617
| test.swift:574:11:574:14 | enter #keyPath(...) | test.swift:574:14:574:14 | KeyPathComponent |
618-
| test.swift:579:7:579:7 | self | test.swift:579:7:579:7 | SSA def(self) |
619-
| test.swift:581:3:581:3 | SSA def(self) | test.swift:582:5:582:5 | self |
620-
| test.swift:581:3:581:3 | self | test.swift:581:3:581:3 | SSA def(self) |
621-
| test.swift:581:8:581:11 | SSA def(s) | test.swift:582:14:582:14 | s |
622-
| test.swift:581:8:581:11 | s | test.swift:581:8:581:11 | SSA def(s) |
623-
| test.swift:582:5:582:5 | [post] self | test.swift:581:3:583:3 | self[return] |
624-
| test.swift:582:5:582:5 | self | test.swift:581:3:583:3 | self[return] |
625-
| test.swift:587:7:587:7 | SSA def(s) | test.swift:588:18:588:18 | s |
626-
| test.swift:587:7:587:7 | s | test.swift:587:7:587:7 | SSA def(s) |
627-
| test.swift:587:11:587:24 | call to S.init(x:) | test.swift:587:7:587:7 | s |
628-
| test.swift:588:7:588:7 | SSA def(s2) | test.swift:590:13:590:13 | s2 |
629-
| test.swift:588:7:588:7 | s2 | test.swift:588:7:588:7 | SSA def(s2) |
630-
| test.swift:588:12:588:19 | call to S2.init(s:) | test.swift:588:7:588:7 | s2 |
631-
| test.swift:589:7:589:7 | SSA def(f) | test.swift:590:25:590:25 | f |
632-
| test.swift:589:7:589:7 | f | test.swift:589:7:589:7 | SSA def(f) |
633-
| test.swift:589:11:589:17 | #keyPath(...) | test.swift:589:7:589:7 | f |
634-
| test.swift:589:11:589:17 | enter #keyPath(...) | test.swift:589:15:589:15 | KeyPathComponent |
618+
| test.swift:575:13:575:13 | s | test.swift:578:13:578:13 | s |
619+
| test.swift:577:7:577:7 | SSA def(inferred) | test.swift:578:24:578:24 | inferred |
620+
| test.swift:577:7:577:7 | inferred | test.swift:577:7:577:7 | SSA def(inferred) |
621+
| test.swift:577:7:577:32 | ... as ... | test.swift:577:7:577:7 | inferred |
622+
| test.swift:577:36:577:38 | #keyPath(...) | test.swift:577:7:577:32 | ... as ... |
623+
| test.swift:577:36:577:38 | enter #keyPath(...) | test.swift:577:38:577:38 | KeyPathComponent |
624+
| test.swift:582:7:582:7 | self | test.swift:582:7:582:7 | SSA def(self) |
625+
| test.swift:584:3:584:3 | SSA def(self) | test.swift:585:5:585:5 | self |
626+
| test.swift:584:3:584:3 | self | test.swift:584:3:584:3 | SSA def(self) |
627+
| test.swift:584:8:584:11 | SSA def(s) | test.swift:585:14:585:14 | s |
628+
| test.swift:584:8:584:11 | s | test.swift:584:8:584:11 | SSA def(s) |
629+
| test.swift:585:5:585:5 | [post] self | test.swift:584:3:586:3 | self[return] |
630+
| test.swift:585:5:585:5 | self | test.swift:584:3:586:3 | self[return] |
631+
| test.swift:590:7:590:7 | SSA def(s) | test.swift:591:18:591:18 | s |
632+
| test.swift:590:7:590:7 | s | test.swift:590:7:590:7 | SSA def(s) |
633+
| test.swift:590:11:590:24 | call to S.init(x:) | test.swift:590:7:590:7 | s |
634+
| test.swift:591:7:591:7 | SSA def(s2) | test.swift:593:13:593:13 | s2 |
635+
| test.swift:591:7:591:7 | s2 | test.swift:591:7:591:7 | SSA def(s2) |
636+
| test.swift:591:12:591:19 | call to S2.init(s:) | test.swift:591:7:591:7 | s2 |
637+
| test.swift:592:7:592:7 | SSA def(f) | test.swift:593:25:593:25 | f |
638+
| test.swift:592:7:592:7 | f | test.swift:592:7:592:7 | SSA def(f) |
639+
| test.swift:592:11:592:17 | #keyPath(...) | test.swift:592:7:592:7 | f |
640+
| test.swift:592:11:592:17 | enter #keyPath(...) | test.swift:592:15:592:15 | KeyPathComponent |
641+
| test.swift:597:9:597:9 | SSA def(array) | test.swift:599:15:599:15 | array |
642+
| test.swift:597:9:597:9 | array | test.swift:597:9:597:9 | SSA def(array) |
643+
| test.swift:597:17:597:26 | [...] | test.swift:597:9:597:9 | array |
644+
| test.swift:598:9:598:9 | SSA def(f) | test.swift:599:30:599:30 | f |
645+
| test.swift:598:9:598:9 | f | test.swift:598:9:598:9 | SSA def(f) |
646+
| test.swift:598:13:598:22 | #keyPath(...) | test.swift:598:9:598:9 | f |
647+
| test.swift:598:13:598:22 | enter #keyPath(...) | test.swift:598:20:598:22 | KeyPathComponent |
648+
| test.swift:603:7:603:7 | self | test.swift:603:7:603:7 | SSA def(self) |
649+
| test.swift:605:3:605:3 | SSA def(self) | test.swift:606:5:606:5 | self |
650+
| test.swift:605:3:605:3 | self | test.swift:605:3:605:3 | SSA def(self) |
651+
| test.swift:605:8:605:12 | SSA def(s) | test.swift:606:14:606:14 | s |
652+
| test.swift:605:8:605:12 | s | test.swift:605:8:605:12 | SSA def(s) |
653+
| test.swift:606:5:606:5 | [post] self | test.swift:605:3:607:3 | self[return] |
654+
| test.swift:606:5:606:5 | self | test.swift:605:3:607:3 | self[return] |
655+
| test.swift:611:9:611:9 | SSA def(s) | test.swift:612:29:612:29 | s |
656+
| test.swift:611:9:611:9 | s | test.swift:611:9:611:9 | SSA def(s) |
657+
| test.swift:611:13:611:26 | call to S.init(x:) | test.swift:611:9:611:9 | s |
658+
| test.swift:612:9:612:9 | SSA def(s2) | test.swift:614:15:614:15 | s2 |
659+
| test.swift:612:9:612:9 | s2 | test.swift:612:9:612:9 | SSA def(s2) |
660+
| test.swift:612:14:612:30 | call to S2_Optional.init(s:) | test.swift:612:9:612:9 | s2 |
661+
| test.swift:613:9:613:9 | SSA def(f) | test.swift:614:27:614:27 | f |
662+
| test.swift:613:9:613:9 | f | test.swift:613:9:613:9 | SSA def(f) |
663+
| test.swift:613:13:613:29 | #keyPath(...) | test.swift:613:9:613:9 | f |
664+
| test.swift:613:13:613:29 | enter #keyPath(...) | test.swift:613:26:613:26 | KeyPathComponent |

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,9 @@ func testKeyPath() {
573573
let s = S(x: source())
574574
let f = \S.x
575575
sink(arg: s[keyPath: f]) // $ flow=573
576+
577+
let inferred : KeyPath<S, Int> = \.x
578+
sink(arg: s[keyPath: inferred]) // $ flow=573
576579
}
577580

578581
struct S2 {
@@ -587,5 +590,26 @@ func testNestedKeyPath() {
587590
let s = S(x: source())
588591
let s2 = S2(s: s)
589592
let f = \S2.s.x
590-
sink(arg: s2[keyPath: f]) // $ flow=587
593+
sink(arg: s2[keyPath: f]) // $ flow=590
594+
}
595+
596+
func testArrayKeyPath() {
597+
let array = [source()]
598+
let f = \[Int].[0]
599+
sink(arg: array[keyPath: f]) // $ MISSING: flow=597
600+
}
601+
602+
struct S2_Optional {
603+
let s: S?
604+
605+
init(s: S?) {
606+
self.s = s
607+
}
608+
}
609+
610+
func testOptionalKeyPath() {
611+
let s = S(x: source())
612+
let s2 = S2_Optional(s: s)
613+
let f = \S2_Optional.s?.x
614+
sink(opt: s2[keyPath: f]) // $ MISSING: flow=611
591615
}

0 commit comments

Comments
 (0)