Skip to content

Commit 04c90a6

Browse files
committed
Swift: Add taint tests for 'Set'.
1 parent 8be6aed commit 04c90a6

File tree

1 file changed

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

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
// --- stubs ---
3+
4+
// --- tests ---
5+
6+
func source(_ label: String) -> Int { return 0 }
7+
func sink(arg: Any) {}
8+
9+
// ---
10+
11+
func testSet(ix: Int) {
12+
let goodSet = Set([1, 2, 3])
13+
sink(arg: goodSet)
14+
sink(arg: goodSet.randomElement()!)
15+
sink(arg: goodSet.min()!)
16+
sink(arg: goodSet.max()!)
17+
sink(arg: goodSet.firstIndex(of: 1)!)
18+
sink(arg: goodSet[goodSet.firstIndex(of: 1)!])
19+
sink(arg: goodSet.first!)
20+
for elem in goodSet {
21+
sink(arg: elem)
22+
}
23+
24+
let taintedSet = Set([1, 2, source("t1")])
25+
sink(arg: taintedSet) // $ tainted=t1
26+
sink(arg: taintedSet.randomElement()!) // $ tainted=t1
27+
sink(arg: taintedSet.min()!) // $ MISSING: tainted=t1
28+
sink(arg: taintedSet.max()!) // $ MISSING: tainted=t1
29+
sink(arg: taintedSet.firstIndex(of: source("t2"))!)
30+
sink(arg: taintedSet[taintedSet.firstIndex(of: source("t3"))!]) // $ tainted=t1
31+
sink(arg: taintedSet.first!) // $ tainted=t1
32+
for elem in taintedSet {
33+
sink(arg: elem) // $ tainted=t1
34+
}
35+
for (ix, elem) in taintedSet.enumerated() {
36+
sink(arg: ix)
37+
sink(arg: elem) // $ MISSING: tainte=t1
38+
}
39+
taintedSet.forEach {
40+
elem in
41+
sink(arg: elem) // $ MISSING: tainted=
42+
}
43+
44+
var set1 = Set<Int>()
45+
set1.insert(1)
46+
sink(arg: set1.randomElement()!)
47+
set1.insert(source("t4"))
48+
sink(arg: set1.randomElement()!) // $ tainted=t4
49+
set1.insert(2)
50+
sink(arg: set1.randomElement()!) // $ tainted=t4
51+
set1.removeAll()
52+
sink(arg: set1.randomElement()!) // $ SPURIOUS: tainted=t4
53+
54+
var set2 = Set<Int>()
55+
set2.update(with: source("t5"))
56+
sink(arg: set2.randomElement()!) // $ MISSING: tainted=t5
57+
58+
var set3 = Set([source("t6")])
59+
sink(arg: set3.randomElement()!) // $ tainted=t6
60+
let (inserted, previous) = set3.insert(source("t7"))
61+
sink(arg: inserted)
62+
sink(arg: previous) // $ tainted=t6 tainted=t7
63+
let previous2 = set3.update(with: source("t8"))
64+
sink(arg: previous2!) // $ MISSING: tainted=t8
65+
let previous3 = set3.remove(source("t9"))
66+
sink(arg: previous3!) // $ MISSING: tainted=t9
67+
let previous4 = set3.removeFirst()
68+
sink(arg: previous4) // $ MISSING: tainted=t6
69+
let previous5 = set3.remove(at: set3.firstIndex(of: source("t10"))!)
70+
sink(arg: previous5) // $ MISSING: tainted=t6
71+
72+
sink(arg: goodSet.union(goodSet).randomElement()!)
73+
sink(arg: goodSet.union(taintedSet).randomElement()!) // $ MISSING: tainted=t1
74+
sink(arg: taintedSet.union(goodSet).randomElement()!) // $ MISSING: tainted=t1
75+
sink(arg: taintedSet.union(taintedSet).randomElement()!) // $ MISSING: tainted=t1
76+
77+
var set4 = Set<Int>()
78+
set4.formUnion(goodSet)
79+
sink(arg: set4.randomElement()!)
80+
set4.formUnion(taintedSet)
81+
sink(arg: set4.randomElement()!) // $ MISSING: tainted=t1
82+
set4.formUnion(goodSet)
83+
sink(arg: set4.randomElement()!) // $ MISSING: tainted=t1
84+
85+
sink(arg: goodSet.intersection(goodSet).randomElement()!)
86+
sink(arg: goodSet.intersection(taintedSet).randomElement()!)
87+
sink(arg: taintedSet.intersection(goodSet).randomElement()!)
88+
sink(arg: taintedSet.intersection(taintedSet).randomElement()!) // $ MISSING: tainted=t1
89+
90+
sink(arg: goodSet.symmetricDifference(goodSet).randomElement()!)
91+
sink(arg: goodSet.symmetricDifference(taintedSet).randomElement()!) // $ MISSING: tainted=t1
92+
sink(arg: taintedSet.symmetricDifference(goodSet).randomElement()!) // $ MISSING: tainted=t1
93+
sink(arg: taintedSet.symmetricDifference(taintedSet).randomElement()!) // $ MISSING: tainted=t1
94+
95+
sink(arg: goodSet.subtracting(goodSet).randomElement()!)
96+
sink(arg: goodSet.subtracting(taintedSet).randomElement()!)
97+
sink(arg: taintedSet.subtracting(goodSet).randomElement()!) // $ MISSING: tainted=t1
98+
sink(arg: taintedSet.subtracting(taintedSet).randomElement()!) // $ MISSING: tainted=t1
99+
100+
sink(arg: taintedSet.sorted().randomElement()!) // $ MISSING: tainted=t1
101+
sink(arg: taintedSet.shuffled().randomElement()!) // $ MISSING: tainted=t1
102+
103+
sink(arg: taintedSet.lazy[taintedSet.firstIndex(of: source("t11"))!]) // $ tainted=t1
104+
105+
var it = taintedSet.makeIterator()
106+
sink(arg: it.next()!) // $ tainted=t1
107+
}

0 commit comments

Comments
 (0)