@@ -6,13 +6,21 @@ class NSData {}
6
6
protocol SortComparator {
7
7
associatedtype Compared
8
8
}
9
- struct Data
9
+
10
+ struct Data : BidirectionalCollection
10
11
{
11
12
struct Base64EncodingOptions : OptionSet { let rawValue : Int }
12
13
struct Base64DecodingOptions : OptionSet { let rawValue : Int }
13
- enum Deallocator { case none }
14
14
struct ReadingOptions : OptionSet { let rawValue : Int }
15
+ enum Deallocator { case none }
15
16
typealias Index = Int
17
+ typealias Element = UInt8
18
+ var startIndex : Self . Index { get { return 0 } }
19
+ var endIndex : Self . Index { get { return 0 } }
20
+ func index( after: Self . Index ) -> Self . Index { return 0 }
21
+ func index( before: Self . Index ) -> Self . Index { return 0 }
22
+ subscript( position: Self . Index ) -> Self . Element { get { return 0 } }
23
+
16
24
init < S> ( _ elements: S ) { }
17
25
init ( base64Encoded: Data , options: Data . Base64DecodingOptions ) { }
18
26
init < SourceType> ( buffer: UnsafeBufferPointer < SourceType > ) { }
@@ -47,9 +55,11 @@ struct Data
47
55
func replaceSubrange< C, R> ( _: R , with: C ) where C : Collection , R : RangeExpression , UInt8 == C . Element , Int == R . Bound { }
48
56
func replacing< C, Replacement> ( _: C , with: Replacement , maxReplacements: Int = . max) -> Data where C : Collection , Replacement : Collection , UInt8 == C . Element , C. Element == Replacement . Element { return Data ( " " ) }
49
57
func replacing< C, Replacement> ( _: C , with: Replacement , subrange: Range < Int > , maxReplacements: Int = . max) -> Data where C : Collection , Replacement : Collection , UInt8 == C . Element , C. Element == Replacement . Element { return Data ( " " ) }
58
+ func sorted( ) -> [ UInt8 ] { return [ ] }
59
+ func sorted( by: ( UInt8 , UInt8 ) throws -> Bool ) rethrows -> [ UInt8 ] { return [ ] }
60
+ func sorted< Comparator> ( using: Comparator ) -> [ UInt8 ] where Comparator : SortComparator , UInt8 == Comparator . Compared { return [ ] }
50
61
func shuffled( ) -> [ UInt8 ] { return [ ] }
51
62
func shuffled< T> ( using: inout T ) -> [ UInt8 ] { return [ ] }
52
- func sorted< Comparator> ( using: Comparator ) -> [ UInt8 ] where Comparator : SortComparator , UInt8 == Comparator . Compared { return [ ] }
53
63
func trimmingPrefix< Prefix> ( _ prefix: Prefix ) -> Data where Prefix : Sequence , UInt8 == Prefix . Element { return Data ( " " ) }
54
64
func trimmingPrefix( while: ( UInt8 ) -> Bool ) -> Data { return Data ( " " ) }
55
65
}
@@ -72,170 +82,182 @@ func taintThroughData() {
72
82
let dataTainted2 = Data ( dataTainted)
73
83
74
84
sink ( arg: dataClean)
75
- sink ( arg: dataTainted) // $ MISSING: tainted=71
76
- sink ( arg: dataTainted2) // $ MISSING: tainted=71
85
+ sink ( arg: dataTainted) // $ MISSING: tainted=81
86
+ sink ( arg: dataTainted2) // $ MISSING: tainted=81
77
87
78
88
// ";Data;true;init(base64Encoded:options:);;;Argument[0];ReturnValue;taint",
79
89
let dataTainted3 = Data ( base64Encoded: source ( ) as! Data , options: [ ] )
80
- sink ( arg: dataTainted3) // $ tainted=79
90
+ sink ( arg: dataTainted3) // $ tainted=89
81
91
82
92
// ";Data;true;init(buffer:);;;Argument[0];ReturnValue;taint",
83
93
let dataTainted4 = Data ( buffer: source ( ) as! UnsafeBufferPointer < UInt8 > )
84
- sink ( arg: dataTainted4) // $ tainted=83
94
+ sink ( arg: dataTainted4) // $ tainted=93
85
95
let dataTainted5 = Data ( buffer: source ( ) as! UnsafeMutablePointer < UInt8 > )
86
- sink ( arg: dataTainted5) // $ tainted=85
96
+ sink ( arg: dataTainted5) // $ tainted=95
87
97
88
98
// ";Data;true;init(bytes:count:);;;Argument[0];ReturnValue;taint",
89
99
let dataTainted6 = Data ( bytes: source ( ) as! UnsafeRawPointer , count: 0 )
90
- sink ( arg: dataTainted6) // $ tainted=89
100
+ sink ( arg: dataTainted6) // $ tainted=99
91
101
92
102
// ";Data;true;init(bytesNoCopy:count:deallocator:);;;Argument[0];ReturnValue;taint",
93
103
let dataTainted7 = Data ( bytesNoCopy: source ( ) as! UnsafeRawPointer , count: 0 , deallocator: Data . Deallocator. none)
94
- sink ( arg: dataTainted7) // $ tainted=93
104
+ sink ( arg: dataTainted7) // $ tainted=103
95
105
96
106
// ";Data;true;init(contentsOf:options:);;;Argument[0];ReturnValue;taint",
97
- let dataTainted8 = Data ( contentsOf: source ( ) as! URL , options: [ ] )
98
- sink ( arg: dataTainted8) // $ tainted=97
107
+ let urlTainted8 = source ( ) as! URL
108
+ let dataTainted8 = Data ( contentsOf: urlTainted8, options: [ ] )
109
+ sink ( arg: dataTainted8) // $ tainted=107
99
110
100
111
// ";Data;true;init(referencing:);;;Argument[0];ReturnValue;taint",
101
112
let dataTainted9 = Data ( referencing: source ( ) as! NSData )
102
- sink ( arg: dataTainted9) // $ tainted=101
113
+ sink ( arg: dataTainted9) // $ tainted=112
103
114
104
115
// ";Data;true;append(_:);;;Argument[0];Argument[-1];taint",
105
116
let dataTainted10 = Data ( " " )
106
117
dataTainted10. append ( source ( ) as! Data )
107
- sink ( arg: dataTainted10) // $ tainted=106
118
+ sink ( arg: dataTainted10) // $ tainted=117
108
119
109
120
let dataTainted11 = Data ( " " )
110
121
dataTainted11. append ( source ( ) as! UInt8 )
111
- sink ( arg: dataTainted11) // $ tainted=110
122
+ sink ( arg: dataTainted11) // $ tainted=121
112
123
113
124
let dataTainted12 = Data ( " " )
114
125
dataTainted12. append ( source ( ) as! UnsafeBufferPointer < UInt8 > )
115
- sink ( arg: dataTainted12) // $ tainted=114
126
+ sink ( arg: dataTainted12) // $ tainted=125
116
127
117
128
// ";Data;true;append(_:count:);;;Argument[0];Argument[-1];taint",
118
129
let dataTainted13 = Data ( " " )
119
130
dataTainted13. append ( source ( ) as! UnsafePointer < UInt8 > , count: 0 )
120
- sink ( arg: dataTainted13) // $ tainted=119
131
+ sink ( arg: dataTainted13) // $ tainted=130
121
132
122
133
// ";Data;true;append(contentsOf:);;;Argument[0];Argument[-1];taint",
123
134
let dataTainted14 = Data ( " " )
124
135
dataTainted14. append ( contentsOf: source ( ) as! [ UInt8 ] )
125
- sink ( arg: dataTainted14) // $ tainted=124
136
+ sink ( arg: dataTainted14) // $ tainted=135
126
137
127
138
// ";Data;true;base64EncodedData(options:);;;Argument[-1];ReturnValue;taint",
128
139
let dataTainted15 = source ( ) as! Data
129
- sink ( arg: dataTainted15. base64EncodedData ( options: [ ] ) ) // $ tainted=128
140
+ sink ( arg: dataTainted15. base64EncodedData ( options: [ ] ) ) // $ tainted=139
130
141
131
142
// ";Data;true;base64EncodedString(options:);;;Argument[-1];ReturnValue;taint",
132
143
let dataTainted16 = source ( ) as! Data
133
- sink ( arg: dataTainted16. base64EncodedString ( options: [ ] ) ) // $ tainted=132
144
+ sink ( arg: dataTainted16. base64EncodedString ( options: [ ] ) ) // $ tainted=143
134
145
135
146
// ";Data;true;compactMap(_:);;;Argument[-1];ReturnValue;taint",
136
147
let dataTainted17 = source ( ) as! Data
137
148
let compactMapped : [ Int ] = dataTainted17. compactMap { str in Int ( str) }
138
- sink ( arg: compactMapped) // $ tainted=136
149
+ sink ( arg: compactMapped) // $ tainted=147
139
150
140
151
// ";Data;true;copyBytes(to:);;;Argument[-1];Argument[0];taint",
141
152
let dataTainted18 = source ( ) as! Data
142
153
let pointerTainted18 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 0 , alignment: 0 )
143
154
dataTainted18. copyBytes ( to: pointerTainted18)
144
- sink ( arg: pointerTainted18) // $ tainted=141
155
+ sink ( arg: pointerTainted18) // $ tainted=152
145
156
146
157
// ";Data;true;copyBytes(to:count:);;;Argument[-1];Argument[0];taint",
147
158
let dataTainted19 = source ( ) as! Data
148
159
let pointerTainted19 = UnsafeMutablePointer< UInt8> . allocate( capacity: 0 )
149
160
dataTainted19. copyBytes ( to: pointerTainted19, count: 0 )
150
- sink ( arg: pointerTainted19) // $ MISSING: tainted=147
161
+ sink ( arg: pointerTainted19) // $ MISSING: tainted=158
151
162
152
163
// ";Data;true;copyBytes(to:from:);;;Argument[-1];Argument[0];taint",
153
164
let dataTainted20 = source ( ) as! Data
154
165
let pointerTainted20 = UnsafeMutablePointer< UInt8> . allocate( capacity: 0 )
155
166
dataTainted20. copyBytes ( to: pointerTainted20, from: 0 ..< 1 )
156
- sink ( arg: pointerTainted20) // $ MISSING: tainted=153
167
+ sink ( arg: pointerTainted20) // $ MISSING: tainted=164
157
168
158
169
// ";Data;true;flatMap(_:);;;Argument[-1];ReturnValue;taint",
159
170
let dataTainted21 = source ( ) as! Data
160
171
let flatMapped = dataTainted21. flatMap { Array ( repeating: $0, count: 0 ) }
161
- sink ( arg: flatMapped) // $ tainted=159
172
+ sink ( arg: flatMapped) // $ tainted=170
162
173
163
174
let dataTainted22 = source ( ) as! Data
164
175
let flatMapped2 = dataTainted22. flatMap { str in Int ( str) }
165
- sink ( arg: flatMapped2) // $ tainted=163
176
+ sink ( arg: flatMapped2) // $ tainted=174
166
177
167
178
// ";Data;true;insert(_:at:);;;Argument[0];Argument[-1];taint",
168
179
let dataTainted23 = Data ( " " )
169
180
dataTainted23. insert ( source ( ) as! UInt8 , at: 0 )
170
- sink ( arg: dataTainted23) // $ tainted=169
181
+ sink ( arg: dataTainted23) // $ tainted=180
171
182
172
183
// ";Data;true;insert(contentsOf:at:);;;Argument[0];Argument[-1];taint",
173
184
let dataTainted24 = Data ( " " )
174
185
dataTainted24. insert ( contentsOf: source ( ) as! [ UInt8 ] , at: 0 )
175
- sink ( arg: dataTainted24) // $ tainted=174
186
+ sink ( arg: dataTainted24) // $ tainted=185
176
187
177
188
// ";Data;true;map(_:);;;Argument[-1];ReturnValue;taint",
178
189
let dataTainted25 = source ( ) as! Data
179
190
let mapped = dataTainted25. map { $0 }
180
- sink ( arg: mapped) // $ tainted=178
191
+ sink ( arg: mapped) // $ tainted=189
181
192
182
193
// ";Data;true;reduce(into:_:);;;Argument[-1];ReturnValue;taint",
183
194
let dataTainted26 = source ( ) as! Data
184
195
let reduced = dataTainted26. reduce ( into: [ : ] ) { c, i in c [ i, default: 0 ] += 1 }
185
- sink ( arg: reduced) // $ tainted=183
196
+ sink ( arg: reduced) // $ tainted=194
186
197
187
198
// ";Data;true;replace(_:with:maxReplacements:);;;Argument[1];Argument[-1];taint",
188
199
let dataTainted27 = Data ( " " )
189
200
dataTainted27. replace ( [ 0 ] , with: source ( ) as! [ UInt8 ] , maxReplacements: . max)
190
- sink ( arg: dataTainted27) // $ tainted=189
201
+ sink ( arg: dataTainted27) // $ tainted=200
191
202
192
203
// ";Data;true;replaceSubrange(_:with:);;;Argument[1];Argument[-1];taint",
193
204
let dataTainted28 = Data ( " " )
194
205
dataTainted28. replaceSubrange ( 1 ..< 3 , with: source ( ) as! Data )
195
- sink ( arg: dataTainted28) // $ tainted=194
206
+ sink ( arg: dataTainted28) // $ tainted=205
196
207
197
208
let dataTainted29 = Data ( " " )
198
209
dataTainted29. replaceSubrange ( 1 ..< 3 , with: source ( ) as! [ UInt8 ] )
199
- sink ( arg: dataTainted29) // $ tainted=198
210
+ sink ( arg: dataTainted29) // $ tainted=209
200
211
201
212
let dataTainted30 = Data ( " " )
202
213
dataTainted30. replaceSubrange ( 1 ..< 3 , with: source ( ) as! UnsafeBufferPointer < UInt8 > )
203
- sink ( arg: dataTainted30) // $ tainted=202
214
+ sink ( arg: dataTainted30) // $ tainted=213
204
215
205
216
// ";Data;true;replaceSubrange(_:with:count:);;;Argument[1];Argument[-1];taint",
206
217
let dataTainted31 = Data ( " " )
207
218
dataTainted31. replaceSubrange ( 1 ..< 3 , with: source ( ) as! UnsafeRawPointer , count: 0 )
208
- sink ( arg: dataTainted31) // $ tainted=207
219
+ sink ( arg: dataTainted31) // $ tainted=218
209
220
210
221
// ";Data;true;replacing(_:with:maxReplacements:);;;Argument[1];Argument[-1];taint",
211
222
let dataTainted32 = Data ( " " )
212
- dataTainted32. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , maxReplacements: 0 )
213
- sink ( arg: dataTainted32) // $ tainted=212
223
+ let _ = dataTainted32. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , maxReplacements: 0 )
224
+ sink ( arg: dataTainted32) // $ tainted=223
214
225
215
226
// ";Data;true;replacing(_:with:subrange:maxReplacements:);;;Argument[1];Argument[-1];taint",
216
227
let dataTainted33 = Data ( " " )
217
- dataTainted33. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , subrange: 1 ..< 3 , maxReplacements: 0 )
218
- sink ( arg: dataTainted33) // $ tainted=217
228
+ let _ = dataTainted33. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , subrange: 1 ..< 3 , maxReplacements: 0 )
229
+ sink ( arg: dataTainted33) // $ tainted=228
219
230
220
- // ";Data;true;shuffled ();;;Argument[-1];ReturnValue;taint",
231
+ // ";Data;true;reversed ();;;Argument[-1];ReturnValue;taint",
221
232
let dataTainted34 = source ( ) as! Data
222
- sink ( arg: dataTainted34. shuffled ( ) ) // $ tainted=221
223
-
224
- // ";Data;true;shuffled(using: );;;Argument[-1];ReturnValue;taint",
233
+ sink ( arg: dataTainted34. reversed ( ) ) // $ MISSING: tainted=232 // Needs models for BidirectionalCollection
234
+
235
+ // ";Data;true;sorted( );;;Argument[-1];ReturnValue;taint",
225
236
let dataTainted35 = source ( ) as! Data
226
- var rng = rng ( ) !
227
- sink ( arg: dataTainted35. shuffled ( using: & rng) ) // $ tainted=225
237
+ sink ( arg: dataTainted35. sorted ( ) ) // $ tainted=236
228
238
229
- // ";Data;true;sorted(using :);;;Argument[-1];ReturnValue;taint",
239
+ // ";Data;true;sorted(by :);;;Argument[-1];ReturnValue;taint",
230
240
let dataTainted36 = source ( ) as! Data
231
- sink ( arg: dataTainted36. sorted ( using : cmp ( ) ! ) ) // $ tainted=230
241
+ sink ( arg: dataTainted36. sorted { _ , _ in return false } ) // $ tainted=240
232
242
233
- // ";Data;true;trimmingPrefix(_ :);;;Argument[-1];ReturnValue;taint",
243
+ // ";Data;true;sorted(using :);;;Argument[-1];ReturnValue;taint",
234
244
let dataTainted37 = source ( ) as! Data
235
- sink ( arg: dataTainted37. trimmingPrefix ( [ 0 ] ) ) // $ tainted=234
245
+ sink ( arg: dataTainted37. sorted ( using : cmp ( ) ! ) ) // $ tainted=244
236
246
237
- // ";Data;true;trimmingPrefix(while: );;;Argument[-1];ReturnValue;taint"
247
+ // ";Data;true;shuffled( );;;Argument[-1];ReturnValue;taint",
238
248
let dataTainted38 = source ( ) as! Data
239
- sink ( arg: dataTainted38. trimmingPrefix { _ in false } ) // $ tainted=238
249
+ sink ( arg: dataTainted38. shuffled ( ) ) // $ tainted=248
250
+
251
+ // ";Data;true;shuffled(using:);;;Argument[-1];ReturnValue;taint",
252
+ let dataTainted39 = source ( ) as! Data
253
+ var rng = rng ( ) !
254
+ sink ( arg: dataTainted39. shuffled ( using: & rng) ) // $ tainted=252
240
255
256
+ // ";Data;true;trimmingPrefix(_:);;;Argument[-1];ReturnValue;taint",
257
+ let dataTainted40 = source ( ) as! Data
258
+ sink ( arg: dataTainted40. trimmingPrefix ( [ 0 ] ) ) // $ tainted=257
259
+
260
+ // ";Data;true;trimmingPrefix(while:);;;Argument[-1];ReturnValue;taint"
261
+ let dataTainted41 = source ( ) as! Data
262
+ sink ( arg: dataTainted41. trimmingPrefix { _ in false } ) // $ tainted=261
241
263
}
0 commit comments