@@ -203,3 +203,109 @@ func testManualMemoryManagement() {
203203 } )
204204 sink ( arg: r6) // $ tainted=r6
205205}
206+
207+ // ---
208+
209+ func testUnsafePointers( ) {
210+ let ptr1 = UnsafeMutablePointer< Int> . allocate( capacity: 1024 )
211+ ptr1. initialize ( repeating: 0 , count: 1024 )
212+ sink ( arg: ptr1 [ 0 ] )
213+ ptr1. initialize ( repeating: sourceInt ( " ptr1 " ) , count: 1024 )
214+ sink ( arg: ptr1 [ 0 ] ) // $ tainted=ptr1
215+
216+ let ptr2 = UnsafeMutablePointer< Int> . allocate( capacity: 1 )
217+ ptr2. initialize ( to: 0 )
218+ sink ( arg: ptr2. pointee)
219+ ptr2. initialize ( to: sourceInt ( " ptr2 " ) )
220+ sink ( arg: ptr2. pointee) // $ MISSING: tainted=ptr2
221+ sink ( arg: ptr2. move ( ) ) // $ tainted=ptr2
222+
223+ let ptr3 = UnsafeMutablePointer< Int> . allocate( capacity: 1024 )
224+ ptr3. initialize ( repeating: 0 , count: 1024 )
225+ sink ( arg: ptr3 [ 0 ] )
226+ ptr3. assign ( repeating: sourceInt ( " ptr3 " ) , count: 1024 )
227+ sink ( arg: ptr3 [ 0 ] ) // $ tainted=ptr3
228+
229+ let ptr4 = UnsafeMutablePointer< Int> . allocate( capacity: 1024 )
230+ ptr4. initialize ( repeating: 0 , count: 1024 )
231+ ptr4. update ( from: ptr1, count: 512 )
232+ sink ( arg: ptr4 [ 0 ] ) // $ tainted=ptr1
233+ }
234+
235+ func testRawPointers( ) {
236+ let raw1 = UnsafeMutableRawPointer . allocate ( byteCount: 1024 , alignment: 4 )
237+ raw1. initializeMemory ( as: Int . self, repeating: 0 , count: 1024 )
238+ sink ( arg: raw1. load ( fromByteOffset: 0 , as: Int . self) )
239+ raw1. initializeMemory ( as: Int . self, repeating: sourceInt ( " raw1 " ) , count: 1024 )
240+ sink ( arg: raw1. load ( fromByteOffset: 0 , as: Int . self) ) // $ tainted=raw1
241+
242+ let raw2 = UnsafeMutableRawPointer . allocate ( byteCount: 1024 , alignment: 4 )
243+ raw2. initializeMemory ( as: Int . self, repeating: 0 , count: 1024 )
244+ //raw2.storeBytes(of: 0, toByteOffset: 0, as: Int.self) --- this line fails on Linux
245+ sink ( arg: raw2. load ( fromByteOffset: 0 , as: Int . self) )
246+ //raw2.storeBytes(of: sourceInt("raw2"), toByteOffset: 0, as: Int.self) --- this line fails on Linux
247+ sink ( arg: raw2. load ( fromByteOffset: 0 , as: Int . self) ) // $ MISSING: tainted=raw2
248+
249+ let raw3 = UnsafeRawPointer ( raw1)
250+ sink ( arg: raw3. load ( fromByteOffset: 0 , as: Int . self) ) // $ tainted=raw1
251+ let raw4 = UnsafeRawBufferPointer ( start: raw3, count: MemoryLayout< Int> . size)
252+ sink ( arg: raw4 [ 0 ] ) // $ tainted=raw1
253+ }
254+
255+ func testRawPointerConversion( ) {
256+ let i1 = sourceInt ( " i1 " )
257+ withUnsafeBytes ( of: i1, {
258+ ptr in // UnsafeRawBufferPointer
259+ sink ( arg: ptr [ 0 ] ) // $ tainted=i1
260+
261+ let ptr2 = UnsafeRawBufferPointer ( ptr)
262+ sink ( arg: ptr2 [ 0 ] ) // $ tainted=i1
263+
264+ let ptr3 = UnsafeMutableRawBufferPointer ( mutating: ptr)
265+ sink ( arg: ptr3 [ 0 ] ) // $ tainted=i1
266+
267+ let ptr4 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 8 , alignment: 0 )
268+ ptr4. copyBytes ( from: ptr)
269+ sink ( arg: ptr4 [ 0 ] ) // $ tainted=i1
270+
271+ let ptr5 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 8 , alignment: 0 )
272+ ptr5. copyMemory ( from: ptr)
273+ sink ( arg: ptr5 [ 0 ] ) // $ tainted=i1
274+
275+ let i = ptr. load ( fromByteOffset: 0 , as: Int . self)
276+ sink ( arg: i) // $ tainted=i1
277+ } )
278+
279+ var i2 = sourceInt ( " i2 " )
280+ withUnsafeMutableBytes ( of: & i2, {
281+ ptr in // UnsafeMutableRawBufferPointer
282+ sink ( arg: ptr [ 0 ] ) // $ tainted=i2
283+
284+ let ptr2 = UnsafeRawBufferPointer ( ptr)
285+ sink ( arg: ptr2 [ 0 ] ) // $ tainted=i2
286+
287+ let ptr3 = UnsafeMutableRawBufferPointer ( ptr)
288+ sink ( arg: ptr3 [ 0 ] ) // $ tainted=i2
289+ } )
290+ }
291+
292+ func testSlice( ) {
293+ let buffer = UnsafeMutableBufferPointer< Int> . allocate( capacity: 1024 )
294+ buffer. initialize ( repeating: 0 )
295+ sink ( arg: buffer [ 0 ] )
296+ buffer [ 0 ] = sourceInt ( " buffer " )
297+ sink ( arg: buffer [ 0 ] ) // $ tainted=buffer
298+
299+ let slice = Slice ( base: buffer, bounds: 0 ..< 10 )
300+ sink ( arg: slice [ 0 ] ) // $ tainted=buffer
301+ sink ( arg: slice. base [ 0 ] ) // $ MISSING: tainted=buffer
302+
303+ let buffer2 = UnsafeMutableBufferPointer ( rebasing: slice)
304+ sink ( arg: buffer2 [ 0 ] ) // $ tainted=buffer
305+
306+ let buffer3 = UnsafeMutableBufferPointer< Int> . allocate( capacity: 1024 )
307+ buffer3. initialize ( repeating: 0 )
308+ sink ( arg: buffer3 [ 0 ] )
309+ buffer3 [ 10 ..< 20 ] = buffer [ 0 ..< 10 ]
310+ sink ( arg: buffer3 [ 0 ] ) // $ tainted=buffer
311+ }
0 commit comments