> On Aug 5, 2016, at 12:43 PM, Jens Persson <j...@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.

https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md#trivial-types

-Andy
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to