Skip to content

Commit 5ea929d

Browse files
authored
Merge pull request github#13662 from geoffw0/swapmodel
Swift: Add dataflow model for 'swap'
2 parents 3cde59e + c1c605e commit 5ea929d

File tree

6 files changed

+79
-1
lines changed

6 files changed

+79
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
5+
* Added a data flow model for `swap(_:_:)`.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Provides models for Swift "Manual Memory Management" functions.
3+
*/
4+
5+
import swift
6+
private import codeql.swift.dataflow.ExternalFlow
7+
8+
private class ManualMemoryManagementSummaries extends SummaryModelCsv {
9+
override predicate row(string row) {
10+
row =
11+
[
12+
";;false;swap(_:_:);;;Argument[0];Argument[1];value",
13+
";;false;swap(_:_:);;;Argument[1];Argument[0];value",
14+
]
15+
}
16+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ private import Data
88
private import FileManager
99
private import FilePath
1010
private import InputStream
11+
private import ManualMemoryManagement
1112
private import NsData
1213
private import NsObject
1314
private import NsString

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,11 @@ edges
269269
| test.swift:592:17:592:17 | KeyPathComponent [x] | test.swift:592:11:592:17 | exit #keyPath(...) |
270270
| test.swift:593:13:593:13 | s2 [s, x] | test.swift:592:11:592:17 | enter #keyPath(...) [s, x] |
271271
| test.swift:593:13:593:13 | s2 [s, x] | test.swift:593:13:593:26 | \\...[...] |
272+
| test.swift:618:13:618:20 | call to source() | test.swift:626:15:626:15 | y |
273+
| test.swift:628:9:628:16 | call to source() | test.swift:630:10:630:11 | &... |
274+
| test.swift:628:9:628:16 | call to source() | test.swift:631:15:631:15 | x |
275+
| test.swift:630:10:630:11 | &... | test.swift:630:14:630:15 | [post] &... |
276+
| test.swift:630:14:630:15 | [post] &... | test.swift:632:15:632:15 | y |
272277
nodes
273278
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
274279
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -562,6 +567,13 @@ nodes
562567
| test.swift:592:17:592:17 | KeyPathComponent [x] | semmle.label | KeyPathComponent [x] |
563568
| test.swift:593:13:593:13 | s2 [s, x] | semmle.label | s2 [s, x] |
564569
| test.swift:593:13:593:26 | \\...[...] | semmle.label | \\...[...] |
570+
| test.swift:618:13:618:20 | call to source() | semmle.label | call to source() |
571+
| test.swift:626:15:626:15 | y | semmle.label | y |
572+
| test.swift:628:9:628:16 | call to source() | semmle.label | call to source() |
573+
| test.swift:630:10:630:11 | &... | semmle.label | &... |
574+
| test.swift:630:14:630:15 | [post] &... | semmle.label | [post] &... |
575+
| test.swift:631:15:631:15 | x | semmle.label | x |
576+
| test.swift:632:15:632:15 | y | semmle.label | y |
565577
subpaths
566578
| 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] &... |
567579
| 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 ... |
@@ -673,3 +685,6 @@ subpaths
673685
| test.swift:575:13:575:25 | \\...[...] | test.swift:573:16:573:23 | call to source() | test.swift:575:13:575:25 | \\...[...] | result |
674686
| test.swift:578:13:578:32 | \\...[...] | test.swift:573:16:573:23 | call to source() | test.swift:578:13:578:32 | \\...[...] | result |
675687
| test.swift:593:13:593:26 | \\...[...] | test.swift:590:16:590:23 | call to source() | test.swift:593:13:593:26 | \\...[...] | result |
688+
| test.swift:626:15:626:15 | y | test.swift:618:13:618:20 | call to source() | test.swift:626:15:626:15 | y | result |
689+
| test.swift:631:15:631:15 | x | test.swift:628:9:628:16 | call to source() | test.swift:631:15:631:15 | x | result |
690+
| test.swift:632:15:632:15 | y | test.swift:628:9:628:16 | call to source() | test.swift:632:15:632:15 | y | result |

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,3 +662,26 @@
662662
| test.swift:613:9:613:9 | f | test.swift:613:9:613:9 | SSA def(f) |
663663
| test.swift:613:13:613:29 | #keyPath(...) | test.swift:613:9:613:9 | f |
664664
| test.swift:613:13:613:29 | enter #keyPath(...) | test.swift:613:26:613:26 | KeyPathComponent |
665+
| test.swift:618:9:618:9 | SSA def(x) | test.swift:622:9:622:9 | x |
666+
| test.swift:618:9:618:9 | x | test.swift:618:9:618:9 | SSA def(x) |
667+
| test.swift:618:13:618:20 | call to source() | test.swift:618:9:618:9 | x |
668+
| test.swift:619:9:619:9 | SSA def(y) | test.swift:623:9:623:9 | y |
669+
| test.swift:619:9:619:9 | y | test.swift:619:9:619:9 | SSA def(y) |
670+
| test.swift:619:13:619:13 | 0 | test.swift:619:9:619:9 | y |
671+
| test.swift:620:9:620:12 | ... as ... | test.swift:620:9:620:9 | t |
672+
| test.swift:622:5:622:9 | SSA def(t) | test.swift:624:9:624:9 | t |
673+
| test.swift:622:9:622:9 | x | test.swift:622:5:622:9 | SSA def(t) |
674+
| test.swift:623:5:623:9 | SSA def(x) | test.swift:625:15:625:15 | x |
675+
| test.swift:623:9:623:9 | y | test.swift:623:5:623:9 | SSA def(x) |
676+
| test.swift:624:5:624:9 | SSA def(y) | test.swift:626:15:626:15 | y |
677+
| test.swift:624:9:624:9 | t | test.swift:624:5:624:9 | SSA def(y) |
678+
| test.swift:628:5:628:16 | SSA def(x) | test.swift:630:11:630:11 | x |
679+
| test.swift:628:9:628:16 | call to source() | test.swift:628:5:628:16 | SSA def(x) |
680+
| test.swift:629:5:629:9 | SSA def(y) | test.swift:630:15:630:15 | y |
681+
| test.swift:629:9:629:9 | 0 | test.swift:629:5:629:9 | SSA def(y) |
682+
| test.swift:630:10:630:11 | &... | test.swift:631:15:631:15 | x |
683+
| test.swift:630:10:630:11 | [post] &... | test.swift:631:15:631:15 | x |
684+
| test.swift:630:11:630:11 | x | test.swift:630:10:630:11 | &... |
685+
| test.swift:630:14:630:15 | &... | test.swift:632:15:632:15 | y |
686+
| test.swift:630:14:630:15 | [post] &... | test.swift:632:15:632:15 | y |
687+
| test.swift:630:15:630:15 | y | test.swift:630:14:630:15 | &... |

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,4 +612,22 @@ func testOptionalKeyPath() {
612612
let s2 = S2_Optional(s: s)
613613
let f = \S2_Optional.s?.x
614614
sink(opt: s2[keyPath: f]) // $ MISSING: flow=611
615-
}
615+
}
616+
617+
func testSwap() {
618+
var x = source()
619+
var y = 0
620+
var t: Int
621+
622+
t = x
623+
x = y
624+
y = t
625+
sink(arg: x)
626+
sink(arg: y) // $ flow=618
627+
628+
x = source()
629+
y = 0
630+
swap(&x, &y)
631+
sink(arg: x) // $ SPURIOUS: flow=628
632+
sink(arg: y) // $ flow=628
633+
}

0 commit comments

Comments
 (0)