[swift-dev] What exactly does it mean for a Swift pointer to be initialized?

Dave Abrahams dabrahams at apple.com
Sat Aug 6 00:42:18 CDT 2016


on Fri Aug 05 2016, Andrew Trick <swift-dev-AT-swift.org> wrote:

>> On Aug 5, 2016, at 12:43 PM, Jens Persson <jens at bitcycle.com> wrote:
>> 
>> I'm trying to understand the new Swift 3 (4?) pointer API and Swift's memory model.
>> 
>> More specifically, I'd like to know more about what exactly it means
>
>> for a pointer to be initialized or not.
>> 
>> For example, I suppose the following code example doesn't satisfy
>> the precondition in the subscript documentation (ie floatsPtr not
>> being initialized when using its subscript):
>> 
>> let numFloats = 123
>> let floatsPtr = UnsafeMutablePointer<Float>.allocate(capacity: numFloats)
>> for i in 0 ..< numFloats { floatsPtr[i] = Float(i) * 0.1 } // Setting values
>> for i in 0 ..< numFloats { print(floatsPtr[i]) } // Getting values
>> floatsPtr.deallocate(capacity: numFloats)
>> 
>> I'd like to understand why/how this could lead to undefined
>> behavior, and what exactly it means for a pointer to be initialized
>> or not.
>> 
>> I've read
>> https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md
>> <https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md>
>> 
>> But I don't feel that I fully understand what it means for a pointer
>> to be initialized, or bound, and if the preconditions and rules for
>> undef behavior are the same no matter if Pointee is a trivial type
>> or a class type.
>
> I think it’s common practice to initialize trivial types via subscript
> assignment. Earlier versions of the proposal actually showed examples
> of this and claimed that it was valid pattern. However, during review
> those examples were removed because it encouraged bad practice and
> complicated the issue.
>
> The fact is, code like this is not going to break anything in the
> compiler and it’s common enough that any model model verifier is going
> to need to special-case trivial types. I think it would be fine to
> rewrite the subscript precondition as follows:
>
> /// - Precondition: the pointee at `self + i` is initialized.
> should read
> /// - Precondition: either the pointee at `self + i` is initialized
> ///   or `Pointee` is a trivial type.

Depending on where you intend to make this change, you may be implicitly
adding the requirement that every possible bit pattern is a valid
representation of a trivial type.  It's fine if you're just changing the
setters for pointee and subscript, but it shouldn't apply to the
getters, IMO.

>
>
> https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md#trivial-types
>
> -Andy
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev
>

-- 
-Dave



More information about the swift-dev mailing list