Skip to content

Commit 3764793

Browse files
committed
Swift: Model LosslessStringConvertible.
1 parent effe376 commit 3764793

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ private class StringSource extends SourceModelCsv {
2727
}
2828

2929
/**
30-
* A model for `String` and `StringProtocol` members that permit taint flow.
30+
* A model for members of `String`, `StringProtocol` and similar classes that permit taint flow.
3131
*/
3232
private class StringSummaries extends SummaryModelCsv {
3333
override predicate row(string row) {
@@ -111,7 +111,8 @@ private class StringSummaries extends SummaryModelCsv {
111111
";String;true;randomElement();;;Argument[-1];ReturnValue;taint",
112112
";String;true;randomElement(using:);;;Argument[-1];ReturnValue;taint",
113113
";String;true;enumerated();;;Argument[-1];ReturnValue;taint",
114-
";String;true;encode(to:);;;Argument[-1];Argument[0];taint"
114+
";String;true;encode(to:);;;Argument[-1];Argument[0];taint",
115+
";LosslessStringConvertible;true;init(_:);;;Argument[0];ReturnValue;taint",
115116
]
116117
}
117118
}

swift/ql/test/library-tests/dataflow/taint/core/LocalTaint.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
| conversions.swift:15:7:15:7 | self | conversions.swift:15:7:15:7 | SSA def(self) |
1111
| conversions.swift:16:11:16:11 | SSA def(self) | conversions.swift:16:11:16:42 | self[return] |
1212
| conversions.swift:16:11:16:11 | self | conversions.swift:16:11:16:11 | SSA def(self) |
13+
| conversions.swift:16:11:16:42 | [summary param] 0 in MyString.init(_:) | conversions.swift:16:11:16:42 | [summary] to write: ReturnValue in MyString.init(_:) |
1314
| conversions.swift:18:28:18:28 | SSA def(self) | conversions.swift:18:28:18:44 | self[return] |
1415
| conversions.swift:18:28:18:28 | self | conversions.swift:18:28:18:28 | SSA def(self) |
1516
| conversions.swift:19:33:19:33 | SSA def(self) | conversions.swift:19:33:19:49 | self[return] |
@@ -73,6 +74,7 @@
7374
| conversions.swift:80:6:80:6 | ms1 | conversions.swift:80:6:80:6 | SSA def(ms1) |
7475
| conversions.swift:80:12:80:26 | call to MyString.init(_:) | conversions.swift:80:12:80:27 | ...! |
7576
| conversions.swift:80:12:80:27 | ...! | conversions.swift:80:6:80:6 | ms1 |
77+
| conversions.swift:80:21:80:21 | abc | conversions.swift:80:12:80:26 | call to MyString.init(_:) |
7678
| conversions.swift:81:12:81:12 | [post] ms1 | conversions.swift:82:12:82:12 | ms1 |
7779
| conversions.swift:81:12:81:12 | ms1 | conversions.swift:82:12:82:12 | ms1 |
7880
| conversions.swift:82:12:82:12 | [post] ms1 | conversions.swift:83:12:83:12 | ms1 |
@@ -83,6 +85,7 @@
8385
| conversions.swift:86:6:86:6 | ms2 | conversions.swift:86:6:86:6 | SSA def(ms2) |
8486
| conversions.swift:86:12:86:35 | call to MyString.init(_:) | conversions.swift:86:12:86:36 | ...! |
8587
| conversions.swift:86:12:86:36 | ...! | conversions.swift:86:6:86:6 | ms2 |
88+
| conversions.swift:86:21:86:34 | call to sourceString() | conversions.swift:86:12:86:35 | call to MyString.init(_:) |
8689
| conversions.swift:87:12:87:12 | [post] ms2 | conversions.swift:88:12:88:12 | ms2 |
8790
| conversions.swift:87:12:87:12 | ms2 | conversions.swift:88:12:88:12 | ms2 |
8891
| conversions.swift:88:12:88:12 | [post] ms2 | conversions.swift:89:12:89:12 | ms2 |

swift/ql/test/library-tests/dataflow/taint/core/Taint.expected

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ edges
3636
| conversions.swift:72:12:72:24 | call to sourceFloat() | conversions.swift:72:12:72:26 | .exponent |
3737
| conversions.swift:73:12:73:24 | call to sourceFloat() | conversions.swift:73:12:73:26 | .significand |
3838
| conversions.swift:78:19:78:32 | call to sourceString() | conversions.swift:78:12:78:33 | call to String.init(_:) |
39+
| conversions.swift:86:12:86:35 | call to MyString.init(_:) | conversions.swift:86:12:86:35 | call to MyString.init(_:) [some:0] |
40+
| conversions.swift:86:12:86:35 | call to MyString.init(_:) | conversions.swift:87:12:87:12 | ms2 |
41+
| conversions.swift:86:12:86:35 | call to MyString.init(_:) [some:0] | conversions.swift:86:12:86:36 | ...! |
42+
| conversions.swift:86:12:86:36 | ...! | conversions.swift:87:12:87:12 | ms2 |
43+
| conversions.swift:86:21:86:34 | call to sourceString() | conversions.swift:86:12:86:35 | call to MyString.init(_:) |
3944
| conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:95:12:95:12 | parent |
4045
| conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:96:12:96:12 | parent |
4146
| conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:98:40:98:40 | parent |
@@ -189,6 +194,11 @@ nodes
189194
| conversions.swift:77:12:77:25 | call to sourceString() | semmle.label | call to sourceString() |
190195
| conversions.swift:78:12:78:33 | call to String.init(_:) | semmle.label | call to String.init(_:) |
191196
| conversions.swift:78:19:78:32 | call to sourceString() | semmle.label | call to sourceString() |
197+
| conversions.swift:86:12:86:35 | call to MyString.init(_:) | semmle.label | call to MyString.init(_:) |
198+
| conversions.swift:86:12:86:35 | call to MyString.init(_:) [some:0] | semmle.label | call to MyString.init(_:) [some:0] |
199+
| conversions.swift:86:12:86:36 | ...! | semmle.label | ...! |
200+
| conversions.swift:86:21:86:34 | call to sourceString() | semmle.label | call to sourceString() |
201+
| conversions.swift:87:12:87:12 | ms2 | semmle.label | ms2 |
192202
| conversions.swift:94:31:94:44 | call to sourceString() | semmle.label | call to sourceString() |
193203
| conversions.swift:95:12:95:12 | parent | semmle.label | parent |
194204
| conversions.swift:96:12:96:12 | parent | semmle.label | parent |
@@ -351,6 +361,7 @@ subpaths
351361
| conversions.swift:73:12:73:26 | .significand | conversions.swift:73:12:73:24 | call to sourceFloat() | conversions.swift:73:12:73:26 | .significand | result |
352362
| conversions.swift:77:12:77:25 | call to sourceString() | conversions.swift:77:12:77:25 | call to sourceString() | conversions.swift:77:12:77:25 | call to sourceString() | result |
353363
| conversions.swift:78:12:78:33 | call to String.init(_:) | conversions.swift:78:19:78:32 | call to sourceString() | conversions.swift:78:12:78:33 | call to String.init(_:) | result |
364+
| conversions.swift:87:12:87:12 | ms2 | conversions.swift:86:21:86:34 | call to sourceString() | conversions.swift:87:12:87:12 | ms2 | result |
354365
| conversions.swift:95:12:95:12 | parent | conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:95:12:95:12 | parent | result |
355366
| conversions.swift:96:12:96:12 | parent | conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:96:12:96:12 | parent | result |
356367
| conversions.swift:99:12:99:12 | v3 | conversions.swift:94:31:94:44 | call to sourceString() | conversions.swift:99:12:99:12 | v3 | result |

swift/ql/test/library-tests/dataflow/taint/core/conversions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func testConversions() {
8484
sink(arg: ms1.clean)
8585

8686
let ms2 = MyString(sourceString())!
87-
sink(arg: ms2) // $ MISSING: tainted=
87+
sink(arg: ms2) // $ tainted=86
8888
sink(arg: ms2.description) // $ MISSING: tainted=
8989
sink(arg: ms2.debugDescription) // $ MISSING: tainted=
9090
sink(arg: ms2.clean)

0 commit comments

Comments
 (0)