Swift: add summary read steps in dataflow

This commit is contained in:
Robert Marsh
2023-08-03 21:07:53 +00:00
parent b301092e34
commit 0142309cab
5 changed files with 60 additions and 2 deletions

View File

@@ -798,6 +798,9 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
subscript.getBase().getType() instanceof ArrayType and
c.isSingleton(any(Content::ArrayContent ac))
)
or
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
node2.(FlowSummaryNode).getSummaryNode())
}
/**

View File

@@ -27,6 +27,7 @@ private class CollectionSummaries extends SummaryModelCsv {
";Collection;true;removeFirst();;;Argument[-1];ReturnValue;taint",
";Collection;true;popFirst();;;Argument[-1];ReturnValue;taint",
";Collection;true;randomElement();;;Argument[-1].SetElement;ReturnValue.OptionalSome;value",
";Collection;true;randomElement();;;Argument[-1].ArrayElement;ReturnValue.OptionalSome;value",
";RangeReplaceableCollection;true;append(_:);;;Argument[0];Argument[-1];taint",
";RangeReplaceableCollection;true;append(contentsOf:);;;Argument[0];Argument[-1];taint",
";RangeReplaceableCollection;true;remove(at:);;;Argument[-1];ReturnValue;taint",

View File

@@ -336,6 +336,19 @@ edges
| test.swift:693:5:693:5 | [post] arr6 [Array element] | test.swift:694:15:694:15 | arr6 [Array element] |
| test.swift:693:17:693:24 | call to source() | test.swift:693:5:693:5 | [post] arr6 [Array element] |
| test.swift:694:15:694:15 | arr6 [Array element] | test.swift:694:15:694:21 | ...[...] |
| test.swift:696:16:696:25 | [...] [Array element] | test.swift:697:15:697:15 | arr7 [Array element] |
| test.swift:696:17:696:24 | call to source() | test.swift:696:16:696:25 | [...] [Array element] |
| test.swift:697:15:697:15 | arr7 [Array element] | test.swift:697:15:697:34 | call to randomElement() [some:0] |
| test.swift:697:15:697:34 | call to randomElement() [some:0] | test.swift:697:15:697:35 | ...! |
| test.swift:703:5:703:5 | [post] set1 [Set element] | test.swift:704:15:704:15 | set1 [Set element] |
| test.swift:703:17:703:24 | call to source() | test.swift:703:5:703:5 | [post] set1 [Set element] |
| test.swift:704:15:704:15 | set1 [Set element] | test.swift:704:15:704:34 | call to randomElement() [some:0] |
| test.swift:704:15:704:34 | call to randomElement() [some:0] | test.swift:704:15:704:35 | ...! |
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] | test.swift:707:15:707:15 | set2 [Set element] |
| test.swift:706:20:706:29 | [...] [Array element] | test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] |
| test.swift:706:21:706:28 | call to source() | test.swift:706:20:706:29 | [...] [Array element] |
| test.swift:707:15:707:15 | set2 [Set element] | test.swift:707:15:707:34 | call to randomElement() [some:0] |
| test.swift:707:15:707:34 | call to randomElement() [some:0] | test.swift:707:15:707:35 | ...! |
nodes
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -706,6 +719,22 @@ nodes
| test.swift:693:17:693:24 | call to source() | semmle.label | call to source() |
| test.swift:694:15:694:15 | arr6 [Array element] | semmle.label | arr6 [Array element] |
| test.swift:694:15:694:21 | ...[...] | semmle.label | ...[...] |
| test.swift:696:16:696:25 | [...] [Array element] | semmle.label | [...] [Array element] |
| test.swift:696:17:696:24 | call to source() | semmle.label | call to source() |
| test.swift:697:15:697:15 | arr7 [Array element] | semmle.label | arr7 [Array element] |
| test.swift:697:15:697:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
| test.swift:697:15:697:35 | ...! | semmle.label | ...! |
| test.swift:703:5:703:5 | [post] set1 [Set element] | semmle.label | [post] set1 [Set element] |
| test.swift:703:17:703:24 | call to source() | semmle.label | call to source() |
| test.swift:704:15:704:15 | set1 [Set element] | semmle.label | set1 [Set element] |
| test.swift:704:15:704:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
| test.swift:704:15:704:35 | ...! | semmle.label | ...! |
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) [Set element] | semmle.label | call to Set<Element>.init(_:) [Set element] |
| test.swift:706:20:706:29 | [...] [Array element] | semmle.label | [...] [Array element] |
| test.swift:706:21:706:28 | call to source() | semmle.label | call to source() |
| test.swift:707:15:707:15 | set2 [Set element] | semmle.label | set2 [Set element] |
| test.swift:707:15:707:34 | call to randomElement() [some:0] | semmle.label | call to randomElement() [some:0] |
| test.swift:707:15:707:35 | ...! | semmle.label | ...! |
subpaths
| 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 |
| 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
| test.swift:678:15:678:26 | ...[...] | test.swift:676:20:676:27 | call to source() | test.swift:678:15:678:26 | ...[...] | result |
| test.swift:682:15:682:27 | ...[...] | test.swift:681:21:681:28 | call to source() | test.swift:682:15:682:27 | ...[...] | result |
| test.swift:694:15:694:21 | ...[...] | test.swift:693:17:693:24 | call to source() | test.swift:694:15:694:21 | ...[...] | result |
| test.swift:697:15:697:35 | ...! | test.swift:696:17:696:24 | call to source() | test.swift:697:15:697:35 | ...! | result |
| test.swift:704:15:704:35 | ...! | test.swift:703:17:703:24 | call to source() | test.swift:704:15:704:35 | ...! | result |
| test.swift:707:15:707:35 | ...! | test.swift:706:21:706:28 | call to source() | test.swift:707:15:707:35 | ...! | result |

View File

@@ -811,3 +811,22 @@
| test.swift:693:5:693:5 | arr6 | test.swift:693:5:693:5 | &... |
| test.swift:694:15:694:15 | [post] arr6 | test.swift:694:15:694:15 | &... |
| test.swift:694:15:694:15 | arr6 | test.swift:694:15:694:15 | &... |
| test.swift:696:9:696:9 | SSA def(arr7) | test.swift:697:15:697:15 | arr7 |
| test.swift:696:9:696:9 | arr7 | test.swift:696:9:696:9 | SSA def(arr7) |
| test.swift:696:16:696:25 | [...] | test.swift:696:9:696:9 | arr7 |
| test.swift:697:15:697:34 | call to randomElement() | test.swift:697:15:697:35 | ...! |
| test.swift:701:9:701:9 | SSA def(set1) | test.swift:702:15:702:15 | set1 |
| test.swift:701:9:701:9 | set1 | test.swift:701:9:701:9 | SSA def(set1) |
| test.swift:701:9:701:15 | ... as ... | test.swift:701:9:701:9 | set1 |
| test.swift:701:21:701:27 | [...] | test.swift:701:9:701:15 | ... as ... |
| test.swift:702:15:702:15 | [post] set1 | test.swift:703:5:703:5 | set1 |
| test.swift:702:15:702:15 | set1 | test.swift:703:5:703:5 | set1 |
| test.swift:702:15:702:34 | call to randomElement() | test.swift:702:15:702:35 | ...! |
| test.swift:703:5:703:5 | &... | test.swift:704:15:704:15 | set1 |
| test.swift:703:5:703:5 | [post] set1 | test.swift:703:5:703:5 | &... |
| test.swift:703:5:703:5 | set1 | test.swift:703:5:703:5 | &... |
| test.swift:704:15:704:34 | call to randomElement() | test.swift:704:15:704:35 | ...! |
| test.swift:706:9:706:9 | SSA def(set2) | test.swift:707:15:707:15 | set2 |
| test.swift:706:9:706:9 | set2 | test.swift:706:9:706:9 | SSA def(set2) |
| test.swift:706:16:706:30 | call to Set<Element>.init(_:) | test.swift:706:9:706:9 | set2 |
| test.swift:707:15:707:34 | call to randomElement() | test.swift:707:15:707:35 | ...! |

View File

@@ -692,14 +692,17 @@ func testArray() {
var arr6 = [1,2,3]
arr6.insert(source(), at: 2)
sink(arg: arr6[0]) // $ flow=693
var arr7 = [source()]
sink(arg: arr7.randomElement()!) // $ flow=696
}
func testSetCollections() {
var set1: Set = [1,2,3]
sink(arg: set1.randomElement()!)
set1.insert(source())
sink(arg: set1.randomElement()!) // $ MISSING: flow=700
sink(arg: set1.randomElement()!) // $flow=703
let set2 = Set([source()])
sink(arg: set2.randomElement()!) // $ MISSING: flow=703
sink(arg: set2.randomElement()!) // $ flow=706
}