Skip to content

Commit 988a871

Browse files
committed
Swift: add flow through for-in loops
1 parent a3e250a commit 988a871

File tree

5 files changed

+134
-3
lines changed

5 files changed

+134
-3
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,13 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
888888
node1.(DictionarySubscriptNode).getExpr() = subscript and
889889
c.isSingleton(any(Content::TupleContent tc | tc.getIndex() = 1))
890890
)
891+
// read of an optional into the loop variable via foreach
892+
or
893+
exists(ForEachStmt for |
894+
node1.asExpr() = for.getNextCall() and
895+
node2.asPattern() = for.getPattern() and
896+
c instanceof OptionalSomeContentSet
897+
)
891898
or
892899
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
893900
node2.(FlowSummaryNode).getSummaryNode())

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ private class SequenceSummaries extends SummaryModelCsv {
2929
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[-1].ArrayElement;Argument[0].Parameter[0].CollectionElement;value",
3030
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[-1].CollectionElement;Argument[0].Parameter[0].CollectionElement;value",
3131
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[0].ReturnValue;ReturnValue.OptionalSome;value",
32+
";Sequence;true;makeIterator();;;Argument[-1].CollectionElement;ReturnValue.CollectionElement;value",
33+
";IteratorProtocol;true;next();;;Argument[-1].CollectionElement;ReturnValue.OptionalSome;value"
3234
]
3335
}
3436
}

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,15 +443,27 @@ edges
443443
| test.swift:774:16:774:23 | call to source() | test.swift:774:5:774:12 | DictionarySubscriptNode [Tuple element at index 1] |
444444
| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] |
445445
| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:776:15:776:22 | ...[...] |
446+
| test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] | test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] |
447+
| test.swift:778:18:778:25 | call to source() | test.swift:778:18:778:28 | (...) [Tuple element at index 0] |
448+
| test.swift:778:18:778:28 | (...) [Tuple element at index 0] | test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] |
449+
| test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] | test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] |
450+
| test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] | test.swift:781:9:781:20 | (...) [Tuple element at index 0] |
451+
| test.swift:781:9:781:20 | (...) [Tuple element at index 0] | test.swift:781:10:781:10 | key |
452+
| test.swift:781:10:781:10 | key | test.swift:782:19:782:19 | key |
453+
| test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] | test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] |
454+
| test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] | test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] |
446455
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] |
447456
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] |
448457
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] |
458+
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] |
449459
| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] |
450460
| test.swift:786:21:786:28 | call to source() | test.swift:786:18:786:28 | (...) [Tuple element at index 1] |
451461
| test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] |
452462
| test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:787:15:787:22 | ...[...] |
453463
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | test.swift:791:15:791:15 | dict3 [Collection element, Tuple element at index 0] |
464+
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] |
454465
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] |
466+
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] |
455467
| test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] | test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] |
456468
| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 0] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] |
457469
| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] |
@@ -462,6 +474,18 @@ edges
462474
| test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] |
463475
| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:792:15:792:36 | ...! [Tuple element at index 1] |
464476
| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | test.swift:792:15:792:38 | .1 |
477+
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] | test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] |
478+
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] | test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] |
479+
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] | test.swift:794:9:794:20 | (...) [Tuple element at index 0] |
480+
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] | test.swift:794:9:794:20 | (...) [Tuple element at index 1] |
481+
| test.swift:794:9:794:20 | (...) [Tuple element at index 0] | test.swift:794:10:794:10 | key |
482+
| test.swift:794:9:794:20 | (...) [Tuple element at index 1] | test.swift:794:15:794:15 | value |
483+
| test.swift:794:10:794:10 | key | test.swift:795:19:795:19 | key |
484+
| test.swift:794:15:794:15 | value | test.swift:796:19:796:19 | value |
485+
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] | test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] |
486+
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] | test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] |
487+
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] | test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] |
488+
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] |
465489
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:800:15:800:15 | dict4 [Collection element, Tuple element at index 1] |
466490
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:801:15:801:15 | dict4 [Collection element, Tuple element at index 1] |
467491
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] |
@@ -481,6 +505,19 @@ edges
481505
| test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] |
482506
| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:803:15:803:36 | ...! [Tuple element at index 1] |
483507
| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | test.swift:803:15:803:38 | .1 |
508+
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | test.swift:811:17:811:17 | set1 [Collection element] |
509+
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | test.swift:815:21:815:21 | set1 [Collection element] |
510+
| test.swift:809:20:809:29 | [...] [Array element] | test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] |
511+
| test.swift:809:21:809:28 | call to source() | test.swift:809:20:809:29 | [...] [Array element] |
512+
| test.swift:811:5:811:5 | $elem$generator [Collection element] | test.swift:811:5:811:5 | call to next() [some:0] |
513+
| test.swift:811:5:811:5 | call to next() [some:0] | test.swift:811:9:811:9 | elem |
514+
| test.swift:811:9:811:9 | elem | test.swift:812:19:812:19 | elem |
515+
| test.swift:811:17:811:17 | call to makeIterator() [Collection element] | test.swift:811:5:811:5 | $elem$generator [Collection element] |
516+
| test.swift:811:17:811:17 | set1 [Collection element] | test.swift:811:17:811:17 | call to makeIterator() [Collection element] |
517+
| test.swift:815:21:815:21 | set1 [Collection element] | test.swift:815:21:815:39 | call to makeIterator() [Collection element] |
518+
| test.swift:815:21:815:39 | call to makeIterator() [Collection element] | test.swift:816:15:816:15 | generator [Collection element] |
519+
| test.swift:816:15:816:15 | generator [Collection element] | test.swift:816:15:816:30 | call to next() [some:0] |
520+
| test.swift:816:15:816:30 | call to next() [some:0] | test.swift:816:15:816:31 | ...! |
484521
nodes
485522
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
486523
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -964,6 +1001,16 @@ nodes
9641001
| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | semmle.label | dict1 [Collection element, Tuple element at index 1] |
9651002
| test.swift:776:15:776:22 | ...[...] | semmle.label | ...[...] |
9661003
| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] |
1004+
| test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] | semmle.label | [...] [Collection element, Tuple element at index 0] |
1005+
| test.swift:778:18:778:25 | call to source() | semmle.label | call to source() |
1006+
| test.swift:778:18:778:28 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
1007+
| test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] | semmle.label | $generator [Collection element, Tuple element at index 0] |
1008+
| test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] | semmle.label | call to next() [some:0, Tuple element at index 0] |
1009+
| test.swift:781:9:781:20 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
1010+
| test.swift:781:10:781:10 | key | semmle.label | key |
1011+
| test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 0] |
1012+
| test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] | semmle.label | dict2 [Collection element, Tuple element at index 0] |
1013+
| test.swift:782:19:782:19 | key | semmle.label | key |
9671014
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] |
9681015
| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
9691016
| test.swift:786:21:786:28 | call to source() | semmle.label | call to source() |
@@ -984,6 +1031,20 @@ nodes
9841031
| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] |
9851032
| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] |
9861033
| test.swift:792:15:792:38 | .1 | semmle.label | .1 |
1034+
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] | semmle.label | $generator [Collection element, Tuple element at index 0] |
1035+
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] | semmle.label | $generator [Collection element, Tuple element at index 1] |
1036+
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] | semmle.label | call to next() [some:0, Tuple element at index 0] |
1037+
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] | semmle.label | call to next() [some:0, Tuple element at index 1] |
1038+
| test.swift:794:9:794:20 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
1039+
| test.swift:794:9:794:20 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
1040+
| test.swift:794:10:794:10 | key | semmle.label | key |
1041+
| test.swift:794:15:794:15 | value | semmle.label | value |
1042+
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 0] |
1043+
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 1] |
1044+
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] | semmle.label | dict3 [Collection element, Tuple element at index 0] |
1045+
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] | semmle.label | dict3 [Collection element, Tuple element at index 1] |
1046+
| test.swift:795:19:795:19 | key | semmle.label | key |
1047+
| test.swift:796:19:796:19 | value | semmle.label | value |
9871048
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] |
9881049
| test.swift:799:18:799:27 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
9891050
| test.swift:799:20:799:27 | call to source() | semmle.label | call to source() |
@@ -1005,6 +1066,20 @@ nodes
10051066
| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] |
10061067
| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] |
10071068
| test.swift:803:15:803:38 | .1 | semmle.label | .1 |
1069+
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | semmle.label | call to Set<Element>.init(_:) [Collection element] |
1070+
| test.swift:809:20:809:29 | [...] [Array element] | semmle.label | [...] [Array element] |
1071+
| test.swift:809:21:809:28 | call to source() | semmle.label | call to source() |
1072+
| test.swift:811:5:811:5 | $elem$generator [Collection element] | semmle.label | $elem$generator [Collection element] |
1073+
| test.swift:811:5:811:5 | call to next() [some:0] | semmle.label | call to next() [some:0] |
1074+
| test.swift:811:9:811:9 | elem | semmle.label | elem |
1075+
| test.swift:811:17:811:17 | call to makeIterator() [Collection element] | semmle.label | call to makeIterator() [Collection element] |
1076+
| test.swift:811:17:811:17 | set1 [Collection element] | semmle.label | set1 [Collection element] |
1077+
| test.swift:812:19:812:19 | elem | semmle.label | elem |
1078+
| test.swift:815:21:815:21 | set1 [Collection element] | semmle.label | set1 [Collection element] |
1079+
| test.swift:815:21:815:39 | call to makeIterator() [Collection element] | semmle.label | call to makeIterator() [Collection element] |
1080+
| test.swift:816:15:816:15 | generator [Collection element] | semmle.label | generator [Collection element] |
1081+
| test.swift:816:15:816:30 | call to next() [some:0] | semmle.label | call to next() [some:0] |
1082+
| test.swift:816:15:816:31 | ...! | semmle.label | ...! |
10081083
subpaths
10091084
| 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 |
10101085
| 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 ... |
@@ -1161,11 +1236,16 @@ subpaths
11611236
| test.swift:757:15:757:19 | .v3 | test.swift:747:14:747:21 | call to source() | test.swift:757:15:757:19 | .v3 | result |
11621237
| test.swift:767:15:767:28 | \\...[...] | test.swift:764:18:764:25 | call to source() | test.swift:767:15:767:28 | \\...[...] | result |
11631238
| test.swift:776:15:776:22 | ...[...] | test.swift:774:16:774:23 | call to source() | test.swift:776:15:776:22 | ...[...] | result |
1239+
| test.swift:782:19:782:19 | key | test.swift:778:18:778:25 | call to source() | test.swift:782:19:782:19 | key | result |
11641240
| test.swift:787:15:787:22 | ...[...] | test.swift:786:21:786:28 | call to source() | test.swift:787:15:787:22 | ...[...] | result |
11651241
| test.swift:791:15:791:38 | .0 | test.swift:789:11:789:18 | call to source() | test.swift:791:15:791:38 | .0 | result |
11661242
| test.swift:792:15:792:38 | .1 | test.swift:786:21:786:28 | call to source() | test.swift:792:15:792:38 | .1 | result |
1243+
| test.swift:795:19:795:19 | key | test.swift:789:11:789:18 | call to source() | test.swift:795:19:795:19 | key | result |
1244+
| test.swift:796:19:796:19 | value | test.swift:786:21:786:28 | call to source() | test.swift:796:19:796:19 | value | result |
11671245
| test.swift:800:15:800:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:800:15:800:53 | ...! | result |
11681246
| test.swift:801:15:801:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:801:15:801:53 | ...! | result |
11691247
| test.swift:802:15:802:38 | .0 | test.swift:800:44:800:51 | call to source() | test.swift:802:15:802:38 | .0 | result |
11701248
| test.swift:803:15:803:38 | .1 | test.swift:799:20:799:27 | call to source() | test.swift:803:15:803:38 | .1 | result |
11711249
| test.swift:803:15:803:38 | .1 | test.swift:801:33:801:40 | call to source() | test.swift:803:15:803:38 | .1 | result |
1250+
| test.swift:812:19:812:19 | elem | test.swift:809:21:809:28 | call to source() | test.swift:812:19:812:19 | elem | result |
1251+
| test.swift:816:15:816:31 | ...! | test.swift:809:21:809:28 | call to source() | test.swift:816:15:816:31 | ...! | result |

0 commit comments

Comments
 (0)