Skip to content

Commit bb05e85

Browse files
committed
[stdlib] restrict pointer arithmetic to UInt
1 parent dd4b646 commit bb05e85

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

stdlib/public/core/UnsafeRawPointer.swift

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -489,9 +489,12 @@ extension UnsafeRawPointer {
489489
@inlinable
490490
@_alwaysEmitIntoClient
491491
public func alignedUp(toMultipleOf alignment: Int) -> Self {
492-
let mask = alignment &- 1
493-
_debugPrecondition(alignment & mask == 0)
494-
let bits = (Int(Builtin.ptrtoint_Word(_rawValue)) &+ mask) & ~mask
492+
let mask = UInt(alignment._builtinWordValue) &- 1
493+
_debugPrecondition(
494+
alignment > 0 && UInt(alignment._builtinWordValue) & mask == 0,
495+
"alignment must be a whole power of 2."
496+
)
497+
let bits = (UInt(Builtin.ptrtoint_Word(_rawValue)) &+ mask) & ~mask
495498
return .init(Builtin.inttoptr_Word(bits._builtinWordValue))
496499
}
497500

@@ -507,9 +510,12 @@ extension UnsafeRawPointer {
507510
@inlinable
508511
@_alwaysEmitIntoClient
509512
public func alignedDown(toMultipleOf alignment: Int) -> Self {
510-
let mask = alignment &- 1
511-
_debugPrecondition(alignment & mask == 0)
512-
let bits = Int(Builtin.ptrtoint_Word(_rawValue)) & ~mask
513+
let mask = UInt(alignment._builtinWordValue) &- 1
514+
_debugPrecondition(
515+
alignment > 0 && UInt(alignment._builtinWordValue) & mask == 0,
516+
"alignment must be a whole power of 2."
517+
)
518+
let bits = UInt(Builtin.ptrtoint_Word(_rawValue)) & ~mask
513519
return .init(Builtin.inttoptr_Word(bits._builtinWordValue))
514520
}
515521
}
@@ -1260,9 +1266,12 @@ extension UnsafeMutableRawPointer {
12601266
@inlinable
12611267
@_alwaysEmitIntoClient
12621268
public func alignedUp(toMultipleOf alignment: Int) -> Self {
1263-
let mask = alignment &- 1
1264-
_debugPrecondition(alignment & mask == 0)
1265-
let bits = (Int(Builtin.ptrtoint_Word(_rawValue)) &+ mask) & ~mask
1269+
let mask = UInt(alignment._builtinWordValue) &- 1
1270+
_debugPrecondition(
1271+
alignment > 0 && UInt(alignment._builtinWordValue) & mask == 0,
1272+
"alignment must be a whole power of 2."
1273+
)
1274+
let bits = (UInt(Builtin.ptrtoint_Word(_rawValue)) &+ mask) & ~mask
12661275
return .init(Builtin.inttoptr_Word(bits._builtinWordValue))
12671276
}
12681277

@@ -1278,9 +1287,12 @@ extension UnsafeMutableRawPointer {
12781287
@inlinable
12791288
@_alwaysEmitIntoClient
12801289
public func alignedDown(toMultipleOf alignment: Int) -> Self {
1281-
let mask = alignment &- 1
1282-
_debugPrecondition(alignment & mask == 0)
1283-
let bits = Int(Builtin.ptrtoint_Word(_rawValue)) & ~mask
1290+
let mask = UInt(alignment._builtinWordValue) &- 1
1291+
_debugPrecondition(
1292+
alignment > 0 && UInt(alignment._builtinWordValue) & mask == 0,
1293+
"alignment must be a whole power of 2."
1294+
)
1295+
let bits = UInt(Builtin.ptrtoint_Word(_rawValue)) & ~mask
12841296
return .init(Builtin.inttoptr_Word(bits._builtinWordValue))
12851297
}
12861298
}

0 commit comments

Comments
 (0)