Skip to content

Commit ba6d348

Browse files
committed
Swift: Add more tests of pointer methods.
1 parent 801878b commit ba6d348

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

swift/ql/test/library-tests/dataflow/taint/libraries/unsafepointer.swift

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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]) // $ MISSING: 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()) // $ MISSING: 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]) // $ MISSING: 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]) // $ MISSING: 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)) // $ MISSING: 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)
245+
sink(arg: raw2.load(fromByteOffset: 0, as: Int.self))
246+
raw2.storeBytes(of: sourceInt("raw2"), toByteOffset: 0, as: Int.self)
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)) // $ MISSING: tainted=raw1
251+
let raw4 = UnsafeRawBufferPointer(start: raw3, count: MemoryLayout<Int>.size)
252+
sink(arg: raw4[0]) // $ MISSING: 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]) // $ MISSING: tainted=i1
263+
264+
let ptr3 = UnsafeMutableRawBufferPointer(mutating: ptr)
265+
sink(arg: ptr3[0]) // $ MISSING: tainted=i1
266+
267+
let ptr4 = UnsafeMutableRawBufferPointer.allocate(byteCount: 8, alignment: 0)
268+
ptr4.copyBytes(from: ptr)
269+
sink(arg: ptr4[0]) // $ MISSING: tainted=i1
270+
271+
let ptr5 = UnsafeMutableRawBufferPointer.allocate(byteCount: 8, alignment: 0)
272+
ptr5.copyMemory(from: ptr)
273+
sink(arg: ptr5[0]) // $ MISSING: tainted=i1
274+
275+
let i = ptr.load(fromByteOffset: 0, as: Int.self)
276+
sink(arg: i) // $ MISSING: 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]) // $ MISSING: tainted=i2
286+
287+
let ptr3 = UnsafeMutableRawBufferPointer(ptr)
288+
sink(arg: ptr3[0]) // $ MISSING: 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]) // $ MISSING: tainted=buffer
301+
sink(arg: slice.base[0]) // $ MISSING: tainted=buffer
302+
303+
let buffer2 = UnsafeMutableBufferPointer(rebasing: slice)
304+
sink(arg: buffer2[0]) // $ MISSING: 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

Comments
 (0)