Skip to content

Commit 1de9919

Browse files
committed
Swift: Test Manual Memory Management closure functions.
1 parent 366a9f1 commit 1de9919

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
// --- stubs ---
33

4+
func sourceInt(_ label: String) -> Int { return 0 }
45
func sourceString(_ label: String) -> String { return "" }
56
func sourceUInt8(_ label: String) -> UInt8 { return 0 }
67
func sink(arg: Any) {}
@@ -127,3 +128,78 @@ func testWritingPointerContainersInCalls(mpc: MyPointerContainer, mgpc: MyGeneri
127128
writeGenericPointerContainer(mgpc: mgpc)
128129
sink(arg: mgpc.ptr.pointee) // $ tainted=writeGenericPointerContainer
129130
}
131+
132+
// ---
133+
134+
func testManualMemoryManagement() {
135+
let i1 = sourceInt("i1")
136+
let r1 = withUnsafePointer(to: i1, {
137+
ptr in
138+
sink(arg: ptr)
139+
sink(arg: ptr[0]) // $ MISSING: tainted=i1
140+
sink(arg: ptr.pointee) // $ MISSING: tainted=i1
141+
return sourceInt("r1")
142+
})
143+
sink(arg: r1) // $ MISSING: tainted=r1
144+
145+
var i2 = sourceInt("i2")
146+
let r2 = withUnsafeMutablePointer(to: &i2, {
147+
ptr in
148+
sink(arg: ptr)
149+
sink(arg: ptr[0]) // $ MISSING: tainted=i2
150+
sink(arg: ptr.pointee) // $ MISSING: tainted=i2
151+
ptr.pointee = sourceInt("i2_overwrite")
152+
sink(arg: ptr)
153+
sink(arg: ptr[0]) // $ MISSING: tainted=i2_overwrite
154+
sink(arg: ptr.pointee) // $ tainted=i2_overwrite
155+
return sourceInt("r2")
156+
})
157+
sink(arg: r2) // $ MISSING: tainted=r2
158+
sink(arg: i2) // $ MISSING: tainted=i2_overwrite SPURIOUS: tainted=i2
159+
160+
let i3 = sourceInt("i3")
161+
let r3 = withUnsafeBytes(of: i3, {
162+
ptr in
163+
sink(arg: ptr)
164+
sink(arg: ptr[0]) // $ MISSING: tainted=i3
165+
ptr.withMemoryRebound(to: Int.self, {
166+
buffer in
167+
sink(arg: buffer)
168+
sink(arg: buffer[0]) // $ MISSING: tainted=i3
169+
})
170+
let buffer2 = ptr.bindMemory(to: Int.self)
171+
sink(arg: buffer2)
172+
sink(arg: buffer2[0]) // $ MISSING: tainted=i3
173+
return sourceInt("r3")
174+
})
175+
sink(arg: r3) // $ MISSING: tainted=r3
176+
177+
var i4 = sourceInt("i4")
178+
let r4 = withUnsafeMutableBytes(of: &i4, {
179+
ptr in
180+
sink(arg: ptr)
181+
sink(arg: ptr[0]) // $ MISSING: tainted=i4
182+
ptr[0] = sourceUInt8("i4_partialwrite")
183+
sink(arg: ptr) // $ tainted=i4_partialwrite MISSING: tainted=i4
184+
sink(arg: ptr[0]) // $ tainted=i4_partialwrite
185+
return sourceInt("r4")
186+
})
187+
sink(arg: r4) // $ MISSING: tainted=r4
188+
sink(arg: i4) // $ tainted=i4 MISSING: tainted=i4_partialwrite
189+
190+
let r5 = withUnsafeTemporaryAllocation(of: Int.self, capacity: 10, {
191+
buffer in
192+
sink(arg: buffer)
193+
sink(arg: buffer[0])
194+
buffer[0] = sourceInt("buffer5")
195+
sink(arg: buffer) // $ tainted=buffer5
196+
sink(arg: buffer[0]) // $ tainted=buffer5
197+
return sourceInt("r5")
198+
})
199+
sink(arg: r5) // $ MISSING: tainted=r5
200+
201+
let r6 = withExtendedLifetime(sourceInt("i6"), {
202+
return sourceInt("r6")
203+
})
204+
sink(arg: r6) // $ MISSING: tainted=r6
205+
}

0 commit comments

Comments
 (0)