From f668feaf64a6a307813e56136564e299b4d10a9b Mon Sep 17 00:00:00 2001 From: Doug Gregor Date: Mon, 10 Mar 2025 15:15:59 -0700 Subject: [PATCH] [Standard library] Additional strict-memory-safety annotations --- stdlib/public/core/AssertCommon.swift | 2 +- stdlib/public/core/EmbeddedPrint.swift | 6 +++--- stdlib/public/core/EmbeddedRuntime.swift | 2 +- stdlib/public/core/PtrAuth.swift | 6 +++--- stdlib/public/core/Span/RawSpan.swift | 2 +- stdlib/public/core/Span/Span.swift | 2 +- stdlib/public/core/VarArgs.swift | 12 ++++++++++-- 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/stdlib/public/core/AssertCommon.swift b/stdlib/public/core/AssertCommon.swift index c20fa3c02d7..94993ef3f80 100644 --- a/stdlib/public/core/AssertCommon.swift +++ b/stdlib/public/core/AssertCommon.swift @@ -163,7 +163,7 @@ internal func _assertionFailure( if _isDebugAssertConfiguration() { var message = message message.withUTF8 { (messageUTF8) -> Void in - _embeddedReportFatalErrorInFile(prefix: prefix, message: messageUTF8, file: file, line: line) + unsafe _embeddedReportFatalErrorInFile(prefix: prefix, message: messageUTF8, file: file, line: line) } } #endif diff --git a/stdlib/public/core/EmbeddedPrint.swift b/stdlib/public/core/EmbeddedPrint.swift index 65d55971fe1..708e7aefb25 100644 --- a/stdlib/public/core/EmbeddedPrint.swift +++ b/stdlib/public/core/EmbeddedPrint.swift @@ -67,9 +67,9 @@ func print(_ buf: UnsafeBufferPointer, terminator: StaticString = "\n") { for c in buf { putchar(CInt(c)) } - var p = terminator.utf8Start - while p.pointee != 0 { - putchar(CInt(p.pointee)) + var p = unsafe terminator.utf8Start + while unsafe p.pointee != 0 { + unsafe putchar(CInt(p.pointee)) p += 1 } } diff --git a/stdlib/public/core/EmbeddedRuntime.swift b/stdlib/public/core/EmbeddedRuntime.swift index 4dc58d6559a..84b2b522029 100644 --- a/stdlib/public/core/EmbeddedRuntime.swift +++ b/stdlib/public/core/EmbeddedRuntime.swift @@ -551,5 +551,5 @@ func _embeddedReportFatalErrorInFile(prefix: StaticString, message: UnsafeBuffer print(line, terminator: ": ") print(prefix, terminator: "") if message.count > 0 { print(": ", terminator: "") } - print(message) + unsafe print(message) } diff --git a/stdlib/public/core/PtrAuth.swift b/stdlib/public/core/PtrAuth.swift index 80207f67cc7..acc4a2de27c 100644 --- a/stdlib/public/core/PtrAuth.swift +++ b/stdlib/public/core/PtrAuth.swift @@ -90,7 +90,7 @@ internal enum _PtrAuth { static func blend(pointer: UnsafeRawPointer, discriminator: UInt64) -> UInt64 { return UInt64(Builtin.int_ptrauth_blend( - UInt64(unsafe UInt(bitPattern: pointer))._value, + UInt64(UInt(bitPattern: pointer))._value, discriminator._value)) } @@ -101,7 +101,7 @@ internal enum _PtrAuth { key: Key, discriminator: UInt64) -> UnsafeRawPointer { let bitPattern = UInt64(Builtin.int_ptrauth_sign( - UInt64(unsafe UInt(bitPattern: pointer))._value, + UInt64(UInt(bitPattern: pointer))._value, key._value._value, discriminator._value)) @@ -118,7 +118,7 @@ internal enum _PtrAuth { newKey: Key, newDiscriminator: UInt64) -> UnsafeRawPointer { let bitPattern = UInt64(Builtin.int_ptrauth_resign( - UInt64(unsafe UInt(bitPattern: pointer))._value, + UInt64(UInt(bitPattern: pointer))._value, oldKey._value._value, oldDiscriminator._value, newKey._value._value, diff --git a/stdlib/public/core/Span/RawSpan.swift b/stdlib/public/core/Span/RawSpan.swift index 1352b8eb263..551d7b5da50 100644 --- a/stdlib/public/core/Span/RawSpan.swift +++ b/stdlib/public/core/Span/RawSpan.swift @@ -440,7 +440,7 @@ extension RawSpan { public func _extracting( unchecked bounds: ClosedRange ) -> Self { - let range = Range( + let range = unsafe Range( _uncheckedBounds: (bounds.lowerBound, bounds.upperBound + 1) ) return unsafe _extracting(unchecked: range) diff --git a/stdlib/public/core/Span/Span.swift b/stdlib/public/core/Span/Span.swift index 351ac09b132..6624d43e35e 100644 --- a/stdlib/public/core/Span/Span.swift +++ b/stdlib/public/core/Span/Span.swift @@ -590,7 +590,7 @@ extension Span where Element: ~Copyable { public func _extracting( unchecked bounds: ClosedRange ) -> Self { - let range = Range( + let range = unsafe Range( _uncheckedBounds: (bounds.lowerBound, bounds.upperBound + 1) ) return unsafe _extracting(unchecked: range) diff --git a/stdlib/public/core/VarArgs.swift b/stdlib/public/core/VarArgs.swift index 82b8f5847d1..2f5dd4c1ea1 100644 --- a/stdlib/public/core/VarArgs.swift +++ b/stdlib/public/core/VarArgs.swift @@ -447,10 +447,12 @@ extension Float80: CVarArg, _CVarArgAligned { // runtime. @_fixed_layout @usableFromInline // c-abi +@unsafe final internal class __VaListBuilder { #if arch(x86_64) || arch(s390x) @frozen // c-abi @usableFromInline + @safe internal struct Header { @usableFromInline // c-abi internal var gp_offset = CUnsignedInt(0) @@ -468,21 +470,27 @@ final internal class __VaListBuilder { #endif @usableFromInline // c-abi + @safe internal var gpRegistersUsed = 0 + @usableFromInline // c-abi + @safe internal var fpRegistersUsed = 0 #if arch(x86_64) || arch(s390x) @usableFromInline // c-abi + @safe final // Property must be final since it is used by Builtin.addressof. internal var header = Header() #endif @usableFromInline // c-abi + @safe internal var storage: ContiguousArray #if !_runtime(_ObjC) @usableFromInline // c-abi + @safe internal var retainer = [CVarArg]() #endif @@ -560,9 +568,9 @@ final internal class __VaListBuilder { internal func va_list() -> CVaListPointer { #if arch(x86_64) || arch(s390x) header.reg_save_area = storage._baseAddress - header.overflow_arg_area + unsafe header.overflow_arg_area = storage._baseAddress + _registerSaveWords - return CVaListPointer( + return unsafe CVaListPointer( _fromUnsafeMutablePointer: UnsafeMutableRawPointer( Builtin.addressof(&self.header))) #elseif arch(arm64)