Skip to content

Commit 50c7c47

Browse files
authored
Adopt strict memory safety annotations in BinaryParsing (swiftlang#14)
1 parent 4c66682 commit 50c7c47

File tree

12 files changed

+100
-77
lines changed

12 files changed

+100
-77
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ let package = Package(
4040
.enableExperimentalFeature("Span"),
4141
.enableExperimentalFeature("ValueGenerics"),
4242
.enableExperimentalFeature("LifetimeDependence"),
43+
.strictMemorySafety(),
4344
]
4445
),
4546
// .target(

Sources/BinaryParsing/Operations/OptionalOperations.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ extension Collection {
2020

2121
@inlinable
2222
public subscript(ifInBounds range: Range<Index>) -> SubSequence? {
23-
let bounds = startIndex...endIndex
2423
guard range.lowerBound >= startIndex, range.upperBound <= endIndex
2524
else { return nil }
2625
return self[range]

Sources/BinaryParsing/Parser Types/ParserSource.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ extension RandomAccessCollection<UInt8> {
5050
) throws(ThrownParsingError) -> T? {
5151
#if canImport(Foundation)
5252
if let data = self as? Foundation.Data {
53-
let result = data.withUnsafeBytes { buffer in
54-
var span = ParserSpan(_unsafeBytes: buffer)
53+
let result = unsafe data.withUnsafeBytes { buffer in
54+
var span = unsafe ParserSpan(_unsafeBytes: buffer)
5555
return Result<T, ThrownParsingError> { try body(&span) }
5656
}
5757
switch result {
@@ -63,7 +63,7 @@ extension RandomAccessCollection<UInt8> {
6363

6464
let result = self.withContiguousStorageIfAvailable { buffer in
6565
let rawBuffer = UnsafeRawBufferPointer(buffer)
66-
var span = ParserSpan(_unsafeBytes: rawBuffer)
66+
var span = unsafe ParserSpan(_unsafeBytes: rawBuffer)
6767
return Result<T, ThrownParsingError> { try body(&span) }
6868
}
6969
switch result {
@@ -118,8 +118,8 @@ extension Data: ParserSpanProvider {
118118
public func withParserSpan<T, E>(
119119
_ body: (inout ParserSpan) throws(E) -> T
120120
) throws(E) -> T {
121-
let result = withUnsafeBytes { buffer in
122-
var span = ParserSpan(_unsafeBytes: buffer)
121+
let result = unsafe withUnsafeBytes { buffer in
122+
var span = unsafe ParserSpan(_unsafeBytes: buffer)
123123
return Result<T, E> { () throws(E) in try body(&span) }
124124
}
125125
switch result {
@@ -134,8 +134,8 @@ extension [UInt8]: ParserSpanProvider {
134134
public func withParserSpan<T, E>(
135135
_ body: (inout ParserSpan) throws(E) -> T
136136
) throws(E) -> T {
137-
let result = self.withUnsafeBytes { rawBuffer in
138-
var span = ParserSpan(_unsafeBytes: rawBuffer)
137+
let result = unsafe self.withUnsafeBytes { rawBuffer in
138+
var span = unsafe ParserSpan(_unsafeBytes: rawBuffer)
139139
return Result<T, E> { () throws(E) in try body(&span) }
140140
}
141141
switch result {
@@ -149,8 +149,8 @@ extension ArraySlice<UInt8>: ParserSpanProvider {
149149
public func withParserSpan<T, E>(
150150
_ body: (inout ParserSpan) throws(E) -> T
151151
) throws(E) -> T {
152-
let result = self.withUnsafeBytes { rawBuffer in
153-
var span = ParserSpan(_unsafeBytes: rawBuffer)
152+
let result = unsafe self.withUnsafeBytes { rawBuffer in
153+
var span = unsafe ParserSpan(_unsafeBytes: rawBuffer)
154154
return Result<T, E> { () throws(E) in try body(&span) }
155155
}
156156
switch result {

Sources/BinaryParsing/Parser Types/ParserSpan.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ public struct ParserSpan: ~Escapable, BitwiseCopyable {
2929
self._upperBound = _bytes.byteCount
3030
}
3131

32+
@unsafe
3233
@inlinable
3334
@lifetime(borrow buffer)
3435
public init(_unsafeBytes buffer: UnsafeRawBufferPointer) {
35-
self._bytes = RawSpan(_unsafeBytes: buffer)
36+
self._bytes = unsafe RawSpan(_unsafeBytes: buffer)
3637
self._lowerBound = 0
3738
self._upperBound = _bytes.byteCount
3839
}
@@ -111,7 +112,7 @@ extension ParserSpan {
111112
subscript(offset i: Int) -> UInt8 {
112113
precondition(i >= 0)
113114
precondition(i < count)
114-
return _bytes.unsafeLoad(
115+
return unsafe _bytes.unsafeLoad(
115116
fromUncheckedByteOffset: _lowerBound &+ i,
116117
as: UInt8.self)
117118
}
@@ -124,10 +125,10 @@ extension ParserSpan {
124125
public func withUnsafeBytes<T, E>(
125126
_ body: (UnsafeRawBufferPointer) throws(E) -> T
126127
) throws(E) -> T {
127-
try _bytes.withUnsafeBytes { (fullBuffer) throws(E) in
128-
let buffer = UnsafeRawBufferPointer(
128+
try unsafe _bytes.withUnsafeBytes { (fullBuffer) throws(E) in
129+
let buffer = unsafe UnsafeRawBufferPointer(
129130
rebasing: fullBuffer[_lowerBound..<_upperBound])
130-
return try body(buffer)
131+
return try unsafe body(buffer)
131132
}
132133
}
133134
}
@@ -153,25 +154,27 @@ extension ParserSpan {
153154
@discardableResult
154155
mutating func consume() -> UInt8? {
155156
guard !isEmpty else { return nil }
156-
return consumeUnchecked()
157+
return unsafe consumeUnchecked()
157158
}
158159

160+
@unsafe
159161
@inlinable
160162
@lifetime(copy self)
161163
mutating func consumeUnchecked(type: UInt8.Type = UInt8.self) -> UInt8 {
162164
defer { _lowerBound &+= 1 }
163-
return _bytes.unsafeLoad(
165+
return unsafe _bytes.unsafeLoad(
164166
fromUncheckedByteOffset: _lowerBound,
165167
as: UInt8.self)
166168
}
167169

170+
@unsafe
168171
@inlinable
169172
@lifetime(copy self)
170173
mutating func consumeUnchecked<T: FixedWidthInteger & BitwiseCopyable>(
171174
type: T.Type
172175
) -> T {
173176
defer { _lowerBound += MemoryLayout<T>.stride }
174-
return _bytes.unsafeLoadUnaligned(
177+
return unsafe _bytes.unsafeLoadUnaligned(
175178
fromUncheckedByteOffset: _lowerBound,
176179
as: T.self)
177180
}

Sources/BinaryParsing/Parsers/Array.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ extension Array where Element == UInt8 {
1616
throws(ParsingError)
1717
{
1818
defer { _ = input.divide(atOffset: input.count) }
19-
self = input.withUnsafeBytes { buffer in
20-
Array(buffer)
19+
self = unsafe input.withUnsafeBytes { buffer in
20+
unsafe Array(buffer)
2121
}
2222
}
2323

@@ -27,8 +27,8 @@ extension Array where Element == UInt8 {
2727
throws(ParsingError)
2828
{
2929
let slice = try input._divide(atByteOffset: byteCount)
30-
self = slice.withUnsafeBytes { buffer in
31-
Array(buffer)
30+
self = unsafe slice.withUnsafeBytes { buffer in
31+
unsafe Array(buffer)
3232
}
3333
}
3434
}

0 commit comments

Comments
 (0)