|
1 | 1 |
|
2 | 2 | // --- stubs ---
|
3 | 3 |
|
| 4 | +func sourceInt(_ label: String) -> Int { return 0 } |
4 | 5 | func sourceString(_ label: String) -> String { return "" }
|
5 | 6 | func sourceUInt8(_ label: String) -> UInt8 { return 0 }
|
6 | 7 | func sink(arg: Any) {}
|
@@ -127,3 +128,78 @@ func testWritingPointerContainersInCalls(mpc: MyPointerContainer, mgpc: MyGeneri
|
127 | 128 | writeGenericPointerContainer(mgpc: mgpc)
|
128 | 129 | sink(arg: mgpc.ptr.pointee) // $ tainted=writeGenericPointerContainer
|
129 | 130 | }
|
| 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