Skip to content

Commit 3fcf2a2

Browse files
committed
[test] pointer arithmetic overflow checks
1 parent 45b81f6 commit 3fcf2a2

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

test/stdlib/UnsafePointer.swift.gyb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,28 @@ ${SelfName}TestSuite.test("pointer(to:)") {
537537
% end
538538
}
539539

540+
${SelfName}TestSuite.test("pointer(to:).overflow") {
541+
struct Example {
542+
var a = false
543+
var b = 0
544+
var c: String { "\(a),\(b)" }
545+
var d = 0.0
546+
}
547+
let o = MemoryLayout<Example>.offset(of: \.b)!
548+
let p = UnsafePointer<Example>(bitPattern: -o)
549+
expectNotNil(p)
550+
guard let p else { fatalError() }
551+
if _isDebugAssertConfiguration() {
552+
expectCrashLater()
553+
}
554+
let intPointer = p.pointer(to: \.b)
555+
expectNil(intPointer) // nil because of overflow
556+
let stringPointer = p.pointer(to: \.c)
557+
expectNil(stringPointer) // nil because c is a computed property
558+
let doublePointer = p.pointer(to: \.d)
559+
expectNotNil(doublePointer)
560+
}
561+
540562
% end
541563

542564
runAllTests()

validation-test/stdlib/UnsafeRawPointerInternal.swift

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,76 @@ UnsafeRawPointerTestSuite.test("load.unaligned.largeAlignment.mutablePointer")
5858
}
5959
}
6060

61+
UnsafeRawPointerTestSuite.test("alignedUp.for.overflow") {
62+
let p = UnsafeRawPointer(bitPattern: 1-MemoryLayout<Int>.stride)!
63+
if _isDebugAssertConfiguration() {
64+
expectCrashLater()
65+
}
66+
let up = p.alignedUp(for: Int.self)
67+
expectEqual(Int(bitPattern: up), 0)
68+
}
69+
70+
UnsafeRawPointerTestSuite.test("alignedUp.toMultiple.overflow") {
71+
let p = UnsafeRawPointer(bitPattern: -7)!
72+
if _isDebugAssertConfiguration() {
73+
expectCrashLater()
74+
}
75+
let up = p.alignedUp(toMultipleOf: 8)
76+
expectEqual(Int(bitPattern: up), 0)
77+
}
78+
79+
UnsafeRawPointerTestSuite.test("alignedUp.for.overflow") {
80+
let p = UnsafeRawPointer(bitPattern: MemoryLayout<Int64>.stride-1)!
81+
if _isDebugAssertConfiguration() {
82+
expectCrashLater()
83+
}
84+
let up = p.alignedDown(for: Int64.self)
85+
expectEqual(Int(bitPattern: up), 0)
86+
}
87+
88+
UnsafeRawPointerTestSuite.test("alignedUp.toMultiple.overflow") {
89+
let p = UnsafeRawPointer(bitPattern: 13)!
90+
if _isDebugAssertConfiguration() {
91+
expectCrashLater()
92+
}
93+
let up = p.alignedDown(toMultipleOf: 16)
94+
expectEqual(Int(bitPattern: up), 0)
95+
}
96+
97+
UnsafeRawPointerTestSuite.test("alignedUp.for.overflow.mutable") {
98+
let p = UnsafeMutableRawPointer(bitPattern: 1-MemoryLayout<Int>.stride)!
99+
if _isDebugAssertConfiguration() {
100+
expectCrashLater()
101+
}
102+
let up = p.alignedUp(for: Int.self)
103+
expectEqual(Int(bitPattern: up), 0)
104+
}
105+
106+
UnsafeRawPointerTestSuite.test("alignedUp.toMultiple.overflow.mutable") {
107+
let p = UnsafeMutableRawPointer(bitPattern: -7)!
108+
if _isDebugAssertConfiguration() {
109+
expectCrashLater()
110+
}
111+
let up = p.alignedUp(toMultipleOf: 8)
112+
expectEqual(Int(bitPattern: up), 0)
113+
}
114+
115+
UnsafeRawPointerTestSuite.test("alignedUp.for.overflow.mutable") {
116+
let p = UnsafeMutableRawPointer(bitPattern: MemoryLayout<Int64>.stride-1)!
117+
if _isDebugAssertConfiguration() {
118+
expectCrashLater()
119+
}
120+
let up = p.alignedDown(for: Int64.self)
121+
expectEqual(Int(bitPattern: up), 0)
122+
}
123+
124+
UnsafeRawPointerTestSuite.test("alignedUp.toMultiple.overflow.mutable") {
125+
let p = UnsafeMutableRawPointer(bitPattern: 13)!
126+
if _isDebugAssertConfiguration() {
127+
expectCrashLater()
128+
}
129+
let up = p.alignedDown(toMultipleOf: 16)
130+
expectEqual(Int(bitPattern: up), 0)
131+
}
132+
61133
runAllTests()

0 commit comments

Comments
 (0)