Skip to content

Commit 0142309

Browse files
committed
Swift: add summary read steps in dataflow
1 parent b301092 commit 0142309

File tree

5 files changed

+60
-2
lines changed

5 files changed

+60
-2
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,9 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
798798
subscript.getBase().getType() instanceof ArrayType and
799799
c.isSingleton(any(Content::ArrayContent ac))
800800
)
801+
or
802+
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
803+
node2.(FlowSummaryNode).getSummaryNode())
801804
}
802805

803806
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ private class CollectionSummaries extends SummaryModelCsv {
2727
";Collection;true;removeFirst();;;Argument[-1];ReturnValue;taint",
2828
";Collection;true;popFirst();;;Argument[-1];ReturnValue;taint",
2929
";Collection;true;randomElement();;;Argument[-1].SetElement;ReturnValue.OptionalSome;value",
30+
";Collection;true;randomElement();;;Argument[-1].ArrayElement;ReturnValue.OptionalSome;value",
3031
";RangeReplaceableCollection;true;append(_:);;;Argument[0];Argument[-1];taint",
3132
";RangeReplaceableCollection;true;append(contentsOf:);;;Argument[0];Argument[-1];taint",
3233
";RangeReplaceableCollection;true;remove(at:);;;Argument[-1];ReturnValue;taint",

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,19 @@ edges
336336
| test.swift:693:5:693:5 | [post] arr6 [Array element] | test.swift:694:15:694:15 | arr6 [Array element] |
337337
| test.swift:693:17:693:24 | call to source() | test.swift:693:5:693:5 | [post] arr6 [Array element] |
338338
| test.swift:694:15:694:15 | arr6 [Array element] | test.swift:694:15:694:21 | ...[...] |
339+
| test.swift:696:16:696:25 | [...] [Array element] | test.swift:697:15:697:15 | arr7 [Array element] |
340+
| test.swift:696:17:696:24 | call to source() | test.swift:696:16:696:25 | [...] [Array element] |
341+
| test.swift:697:15:697:15 | arr7 [Array element] | test.swift:697:15:697:34 | call to randomElement() [some:0] |
342+
| test.swift:697:15:697:34 | call to randomElement() [some:0] | test.swift:697:15:697:35 | ...! |
343+
| test.swift:703:5:703:5 | [post] set1 [Set element] | test.swift:704:15:704:15 | set1 [Set element] |
344+
| test.swift:703:17:703:24 | call to source() | test.swift:703:5:703:5 | [post] set1 [Set element] |
345+
| test.swift:704:15:704:15 | set1 [Set element] | test.swift:704:15:704:34 | call to randomElement() [some:0] |
346+
| test.swift:704:15:704:34 | call to randomElement() [some:0] | test.swift:704:15:704:35 | ...! |
347+
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] | test.swift:707:15:707:15 | set2 [Set element] |
348+
| test.swift:706:20:706:29 | [...] [Array element] | test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] |
349+
| test.swift:706:21:706:28 | call to source() | test.swift:706:20:706:29 | [...] [Array element] |
350+
| test.swift:707:15:707:15 | set2 [Set element] | test.swift:707:15:707:34 | call to randomElement() [some:0] |
351+
| test.swift:707:15:707:34 | call to randomElement() [some:0] | test.swift:707:15:707:35 | ...! |
339352
nodes
340353
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
341354
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -706,6 +719,22 @@ nodes
706719
| test.swift:693:17:693:24 | call to source() | semmle.label | call to source() |
707720
| test.swift:694:15:694:15 | arr6 [Array element] | semmle.label | arr6 [Array element] |
708721
| test.swift:694:15:694:21 | ...[...] | semmle.label | ...[...] |
722+
| test.swift:696:16:696:25 | [...] [Array element] | semmle.label | [...] [Array element] |
723+
| test.swift:696:17:696:24 | call to source() | semmle.label | call to source() |
724+
| test.swift:697:15:697:15 | arr7 [Array element] | semmle.label | arr7 [Array element] |
725+
| test.swift:697:15:697:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
726+
| test.swift:697:15:697:35 | ...! | semmle.label | ...! |
727+
| test.swift:703:5:703:5 | [post] set1 [Set element] | semmle.label | [post] set1 [Set element] |
728+
| test.swift:703:17:703:24 | call to source() | semmle.label | call to source() |
729+
| test.swift:704:15:704:15 | set1 [Set element] | semmle.label | set1 [Set element] |
730+
| test.swift:704:15:704:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
731+
| test.swift:704:15:704:35 | ...! | semmle.label | ...! |
732+
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] | semmle.label | call to Set<Element>.init(_:) [Set element] |
733+
| test.swift:706:20:706:29 | [...] [Array element] | semmle.label | [...] [Array element] |
734+
| test.swift:706:21:706:28 | call to source() | semmle.label | call to source() |
735+
| test.swift:707:15:707:15 | set2 [Set element] | semmle.label | set2 [Set element] |
736+
| test.swift:707:15:707:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
737+
| test.swift:707:15:707:35 | ...! | semmle.label | ...! |
709738
subpaths
710739
| 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 |
711740
| 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 ... |
@@ -835,3 +864,6 @@ subpaths
835864
| test.swift:678:15:678:26 | ...[...] | test.swift:676:20:676:27 | call to source() | test.swift:678:15:678:26 | ...[...] | result |
836865
| test.swift:682:15:682:27 | ...[...] | test.swift:681:21:681:28 | call to source() | test.swift:682:15:682:27 | ...[...] | result |
837866
| test.swift:694:15:694:21 | ...[...] | test.swift:693:17:693:24 | call to source() | test.swift:694:15:694:21 | ...[...] | result |
867+
| test.swift:697:15:697:35 | ...! | test.swift:696:17:696:24 | call to source() | test.swift:697:15:697:35 | ...! | result |
868+
| test.swift:704:15:704:35 | ...! | test.swift:703:17:703:24 | call to source() | test.swift:704:15:704:35 | ...! | result |
869+
| test.swift:707:15:707:35 | ...! | test.swift:706:21:706:28 | call to source() | test.swift:707:15:707:35 | ...! | result |

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,3 +811,22 @@
811811
| test.swift:693:5:693:5 | arr6 | test.swift:693:5:693:5 | &... |
812812
| test.swift:694:15:694:15 | [post] arr6 | test.swift:694:15:694:15 | &... |
813813
| test.swift:694:15:694:15 | arr6 | test.swift:694:15:694:15 | &... |
814+
| test.swift:696:9:696:9 | SSA def(arr7) | test.swift:697:15:697:15 | arr7 |
815+
| test.swift:696:9:696:9 | arr7 | test.swift:696:9:696:9 | SSA def(arr7) |
816+
| test.swift:696:16:696:25 | [...] | test.swift:696:9:696:9 | arr7 |
817+
| test.swift:697:15:697:34 | call to randomElement() | test.swift:697:15:697:35 | ...! |
818+
| test.swift:701:9:701:9 | SSA def(set1) | test.swift:702:15:702:15 | set1 |
819+
| test.swift:701:9:701:9 | set1 | test.swift:701:9:701:9 | SSA def(set1) |
820+
| test.swift:701:9:701:15 | ... as ... | test.swift:701:9:701:9 | set1 |
821+
| test.swift:701:21:701:27 | [...] | test.swift:701:9:701:15 | ... as ... |
822+
| test.swift:702:15:702:15 | [post] set1 | test.swift:703:5:703:5 | set1 |
823+
| test.swift:702:15:702:15 | set1 | test.swift:703:5:703:5 | set1 |
824+
| test.swift:702:15:702:34 | call to randomElement() | test.swift:702:15:702:35 | ...! |
825+
| test.swift:703:5:703:5 | &... | test.swift:704:15:704:15 | set1 |
826+
| test.swift:703:5:703:5 | [post] set1 | test.swift:703:5:703:5 | &... |
827+
| test.swift:703:5:703:5 | set1 | test.swift:703:5:703:5 | &... |
828+
| test.swift:704:15:704:34 | call to randomElement() | test.swift:704:15:704:35 | ...! |
829+
| test.swift:706:9:706:9 | SSA def(set2) | test.swift:707:15:707:15 | set2 |
830+
| test.swift:706:9:706:9 | set2 | test.swift:706:9:706:9 | SSA def(set2) |
831+
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) | test.swift:706:9:706:9 | set2 |
832+
| test.swift:707:15:707:34 | call to randomElement() | test.swift:707:15:707:35 | ...! |

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,14 +692,17 @@ func testArray() {
692692
var arr6 = [1,2,3]
693693
arr6.insert(source(), at: 2)
694694
sink(arg: arr6[0]) // $ flow=693
695+
696+
var arr7 = [source()]
697+
sink(arg: arr7.randomElement()!) // $ flow=696
695698
}
696699

697700
func testSetCollections() {
698701
var set1: Set = [1,2,3]
699702
sink(arg: set1.randomElement()!)
700703
set1.insert(source())
701-
sink(arg: set1.randomElement()!) // $ MISSING: flow=700
704+
sink(arg: set1.randomElement()!) // $flow=703
702705

703706
let set2 = Set([source()])
704-
sink(arg: set2.randomElement()!) // $ MISSING: flow=703
707+
sink(arg: set2.randomElement()!) // $ flow=706
705708
}

0 commit comments

Comments
 (0)