mirror of
https://github.com/github/codeql.git
synced 2026-03-06 15:49:08 +01:00
Swift: Add tests for custom append/insert.
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
// --- stubs ---
|
||||
|
||||
class Data {
|
||||
init<S>(_ elements: S) {}
|
||||
}
|
||||
|
||||
struct URL {
|
||||
init?(string: String) {}
|
||||
}
|
||||
|
||||
// A `MyContainer` contains `Data` in something rather like a `Sequence`.
|
||||
struct MyContainer {
|
||||
init() { }
|
||||
init(data: Data) { }
|
||||
init(data: Data, flags: Int) { }
|
||||
|
||||
mutating func append(_ data: Data) { }
|
||||
mutating func insert(_ data: Data, at: Int) { }
|
||||
func appending(_ data: Data) -> MyContainer { return self }
|
||||
func inserting(_ data: Data, at: Int) -> MyContainer { return self }
|
||||
|
||||
mutating func append(contentsOf other: MyContainer) { }
|
||||
mutating func insert(contentsOf other: MyContainer, at: Int) { }
|
||||
func appending(contentsOf other: MyContainer) -> MyContainer { return self }
|
||||
func inserting(contentsOf other: MyContainer, at: Int) -> MyContainer { return self }
|
||||
|
||||
mutating func append(_ string: String) { }
|
||||
mutating func append(contentsOf array: Array<Data>) { }
|
||||
|
||||
subscript(index: Int) -> Data { return Data(0) }
|
||||
}
|
||||
|
||||
// --- tests ---
|
||||
|
||||
func source(_ label: String) -> Data { return Data(0) }
|
||||
func sourceString(_ label: String) -> String { return "" }
|
||||
func sink(arg: Any) {}
|
||||
|
||||
// ---
|
||||
|
||||
func testCustom() {
|
||||
let clean = MyContainer(data: Data(0))
|
||||
let tainted = MyContainer(data: source("data1"))
|
||||
let tainted2 = MyContainer(data: source("data2"), flags: 123)
|
||||
sink(arg: clean)
|
||||
sink(arg: clean[0])
|
||||
sink(arg: tainted) // $ MISSING: tainted=data1
|
||||
sink(arg: tainted[0]) // $ MISSING: tainted=data1
|
||||
sink(arg: tainted2) // $ MISSING: tainted=data2
|
||||
sink(arg: tainted2[0]) // $ MISSING: tainted=data2
|
||||
|
||||
var mc1 = MyContainer()
|
||||
mc1.append(Data(0))
|
||||
sink(arg: mc1)
|
||||
sink(arg: mc1[0])
|
||||
mc1.append(source("data3"))
|
||||
sink(arg: mc1) // $ MISSING: tainted=data3
|
||||
sink(arg: mc1[0]) // $ MISSING: tainted=data3
|
||||
|
||||
var mc2 = MyContainer()
|
||||
mc2.insert(Data(0), at: 0)
|
||||
sink(arg: mc2)
|
||||
sink(arg: mc2[0])
|
||||
mc2.insert(source("data4"), at: 0)
|
||||
sink(arg: mc2) // $ MISSING: tainted=data4
|
||||
sink(arg: mc2[0]) // $ MISSING: tainted=data4
|
||||
|
||||
var mc3 = MyContainer()
|
||||
mc3.append(contentsOf: clean)
|
||||
sink(arg: mc3)
|
||||
sink(arg: mc3[0])
|
||||
mc3.append(contentsOf: tainted)
|
||||
sink(arg: mc3) // $ MISSING: tainted=data1
|
||||
sink(arg: mc3[0]) // $ MISSING: tainted=data1
|
||||
|
||||
var mc4 = MyContainer()
|
||||
mc4.insert(contentsOf: clean, at: 0)
|
||||
sink(arg: mc4)
|
||||
sink(arg: mc4[0])
|
||||
mc4.insert(contentsOf: tainted, at: 0)
|
||||
sink(arg: mc4) // $ MISSING: tainted=data1
|
||||
sink(arg: mc4[0]) // $ MISSING: tainted=data1
|
||||
|
||||
let mc5 = MyContainer()
|
||||
sink(arg: mc5.appending(Data(0)))
|
||||
sink(arg: mc5.appending(Data(0))[0])
|
||||
sink(arg: mc5.appending(source("data5"))) // $ MISSING: tainted=data5
|
||||
sink(arg: mc5.appending(source("data6"))[0]) // $ MISSING: tainted=data6
|
||||
sink(arg: mc5.inserting(Data(0), at: 0))
|
||||
sink(arg: mc5.inserting(Data(0), at: 0)[0])
|
||||
sink(arg: mc5.inserting(source("data7"), at: 0)) // $ MISSING: tainted=data7
|
||||
sink(arg: mc5.inserting(source("data8"), at: 0)[0]) // $ MISSING: tainted=data8
|
||||
sink(arg: mc5.appending(contentsOf: clean))
|
||||
sink(arg: mc5.appending(contentsOf: clean)[0])
|
||||
sink(arg: mc5.appending(contentsOf: tainted)) // $ MISSING: tainted=data1
|
||||
sink(arg: mc5.appending(contentsOf: tainted)[0]) // $ MISSING: tainted=data1
|
||||
sink(arg: mc5.inserting(contentsOf: clean, at: 0))
|
||||
sink(arg: mc5.inserting(contentsOf: clean, at: 0)[0])
|
||||
sink(arg: mc5.inserting(contentsOf: tainted, at: 0)) // $ MISSING: tainted=data1
|
||||
sink(arg: mc5.inserting(contentsOf: tainted, at: 0)[0]) // $ MISSING: tainted=data1
|
||||
sink(arg: mc5)
|
||||
|
||||
let taintedString = sourceString("data9")
|
||||
var mc6 = MyContainer()
|
||||
mc6.append("")
|
||||
sink(arg: mc6)
|
||||
sink(arg: mc6[0])
|
||||
mc6.append(taintedString)
|
||||
sink(arg: mc6) // $ MISSING: tainted=data9
|
||||
sink(arg: mc6[0]) // $ MISSING: tainted=data9
|
||||
|
||||
let taintedArray = [source("data10")]
|
||||
var mc7 = MyContainer()
|
||||
mc7.append(contentsOf: [])
|
||||
sink(arg: mc7)
|
||||
sink(arg: mc7[0])
|
||||
mc7.append(contentsOf: taintedArray)
|
||||
sink(arg: mc7) // $ MISSING: tainted=data10
|
||||
sink(arg: mc7[0]) // $ MISSING: tainted=data10
|
||||
}
|
||||
Reference in New Issue
Block a user