Skip to content

Commit 4b87dd5

Browse files
committed
Swift: Add tests for custom append/insert.
1 parent 4c2a623 commit 4b87dd5

File tree

1 file changed

+120
-0
lines changed
  • swift/ql/test/library-tests/dataflow/taint/libraries

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// --- stubs ---
2+
3+
class Data {
4+
init<S>(_ elements: S) {}
5+
}
6+
7+
struct URL {
8+
init?(string: String) {}
9+
}
10+
11+
// A `MyContainer` contains `Data` in something rather like a `Sequence`.
12+
struct MyContainer {
13+
init() { }
14+
init(data: Data) { }
15+
init(data: Data, flags: Int) { }
16+
17+
mutating func append(_ data: Data) { }
18+
mutating func insert(_ data: Data, at: Int) { }
19+
func appending(_ data: Data) -> MyContainer { return self }
20+
func inserting(_ data: Data, at: Int) -> MyContainer { return self }
21+
22+
mutating func append(contentsOf other: MyContainer) { }
23+
mutating func insert(contentsOf other: MyContainer, at: Int) { }
24+
func appending(contentsOf other: MyContainer) -> MyContainer { return self }
25+
func inserting(contentsOf other: MyContainer, at: Int) -> MyContainer { return self }
26+
27+
mutating func append(_ string: String) { }
28+
mutating func append(contentsOf array: Array<Data>) { }
29+
30+
subscript(index: Int) -> Data { return Data(0) }
31+
}
32+
33+
// --- tests ---
34+
35+
func source(_ label: String) -> Data { return Data(0) }
36+
func sourceString(_ label: String) -> String { return "" }
37+
func sink(arg: Any) {}
38+
39+
// ---
40+
41+
func testCustom() {
42+
let clean = MyContainer(data: Data(0))
43+
let tainted = MyContainer(data: source("data1"))
44+
let tainted2 = MyContainer(data: source("data2"), flags: 123)
45+
sink(arg: clean)
46+
sink(arg: clean[0])
47+
sink(arg: tainted) // $ MISSING: tainted=data1
48+
sink(arg: tainted[0]) // $ MISSING: tainted=data1
49+
sink(arg: tainted2) // $ MISSING: tainted=data2
50+
sink(arg: tainted2[0]) // $ MISSING: tainted=data2
51+
52+
var mc1 = MyContainer()
53+
mc1.append(Data(0))
54+
sink(arg: mc1)
55+
sink(arg: mc1[0])
56+
mc1.append(source("data3"))
57+
sink(arg: mc1) // $ MISSING: tainted=data3
58+
sink(arg: mc1[0]) // $ MISSING: tainted=data3
59+
60+
var mc2 = MyContainer()
61+
mc2.insert(Data(0), at: 0)
62+
sink(arg: mc2)
63+
sink(arg: mc2[0])
64+
mc2.insert(source("data4"), at: 0)
65+
sink(arg: mc2) // $ MISSING: tainted=data4
66+
sink(arg: mc2[0]) // $ MISSING: tainted=data4
67+
68+
var mc3 = MyContainer()
69+
mc3.append(contentsOf: clean)
70+
sink(arg: mc3)
71+
sink(arg: mc3[0])
72+
mc3.append(contentsOf: tainted)
73+
sink(arg: mc3) // $ MISSING: tainted=data1
74+
sink(arg: mc3[0]) // $ MISSING: tainted=data1
75+
76+
var mc4 = MyContainer()
77+
mc4.insert(contentsOf: clean, at: 0)
78+
sink(arg: mc4)
79+
sink(arg: mc4[0])
80+
mc4.insert(contentsOf: tainted, at: 0)
81+
sink(arg: mc4) // $ MISSING: tainted=data1
82+
sink(arg: mc4[0]) // $ MISSING: tainted=data1
83+
84+
let mc5 = MyContainer()
85+
sink(arg: mc5.appending(Data(0)))
86+
sink(arg: mc5.appending(Data(0))[0])
87+
sink(arg: mc5.appending(source("data5"))) // $ MISSING: tainted=data5
88+
sink(arg: mc5.appending(source("data6"))[0]) // $ MISSING: tainted=data6
89+
sink(arg: mc5.inserting(Data(0), at: 0))
90+
sink(arg: mc5.inserting(Data(0), at: 0)[0])
91+
sink(arg: mc5.inserting(source("data7"), at: 0)) // $ MISSING: tainted=data7
92+
sink(arg: mc5.inserting(source("data8"), at: 0)[0]) // $ MISSING: tainted=data8
93+
sink(arg: mc5.appending(contentsOf: clean))
94+
sink(arg: mc5.appending(contentsOf: clean)[0])
95+
sink(arg: mc5.appending(contentsOf: tainted)) // $ MISSING: tainted=data1
96+
sink(arg: mc5.appending(contentsOf: tainted)[0]) // $ MISSING: tainted=data1
97+
sink(arg: mc5.inserting(contentsOf: clean, at: 0))
98+
sink(arg: mc5.inserting(contentsOf: clean, at: 0)[0])
99+
sink(arg: mc5.inserting(contentsOf: tainted, at: 0)) // $ MISSING: tainted=data1
100+
sink(arg: mc5.inserting(contentsOf: tainted, at: 0)[0]) // $ MISSING: tainted=data1
101+
sink(arg: mc5)
102+
103+
let taintedString = sourceString("data9")
104+
var mc6 = MyContainer()
105+
mc6.append("")
106+
sink(arg: mc6)
107+
sink(arg: mc6[0])
108+
mc6.append(taintedString)
109+
sink(arg: mc6) // $ MISSING: tainted=data9
110+
sink(arg: mc6[0]) // $ MISSING: tainted=data9
111+
112+
let taintedArray = [source("data10")]
113+
var mc7 = MyContainer()
114+
mc7.append(contentsOf: [])
115+
sink(arg: mc7)
116+
sink(arg: mc7[0])
117+
mc7.append(contentsOf: taintedArray)
118+
sink(arg: mc7) // $ MISSING: tainted=data10
119+
sink(arg: mc7[0]) // $ MISSING: tainted=data10
120+
}

0 commit comments

Comments
 (0)