<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 5, 2016, at 12:43 PM, Jens Persson <<a href="mailto:jens@bitcycle.com" class="">jens@bitcycle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_signature" data-smartmail="gmail_signature">I'm trying to understand the new Swift 3 (4?) pointer API and Swift's memory model.</div><div class="gmail_signature" data-smartmail="gmail_signature"><br class=""></div><div class="gmail_signature" data-smartmail="gmail_signature">More specifically, I'd like to know more about what exactly it means for a pointer to be initialized or not.</div><div class="gmail_signature" data-smartmail="gmail_signature"><br class=""></div><div class="gmail_signature" data-smartmail="gmail_signature"><div class="gmail_signature" data-smartmail="gmail_signature">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):</div><div class="gmail_signature" data-smartmail="gmail_signature"><br class=""></div><div class="gmail_signature" data-smartmail="gmail_signature">let numFloats = 123</div><div class="gmail_signature" data-smartmail="gmail_signature">let floatsPtr = UnsafeMutablePointer<Float>.allocate(capacity: numFloats)</div><div class="gmail_signature" data-smartmail="gmail_signature">for i in 0 ..< numFloats { floatsPtr[i] = Float(i) * 0.1 } // Setting values</div><div class="gmail_signature" data-smartmail="gmail_signature">for i in 0 ..< numFloats { print(floatsPtr[i]) } // Getting values</div><div class="gmail_signature" data-smartmail="gmail_signature">floatsPtr.deallocate(capacity: numFloats)</div><div class="gmail_signature" data-smartmail="gmail_signature"><br class=""></div><div class="gmail_signature" data-smartmail="gmail_signature">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.</div><div class=""><br class=""></div><div class=""><div class="">I've read <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md</a></div></div><div class=""><br class=""></div><div class="">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. </div></div></div></div></blockquote><br class=""></div><div>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.</div><div><br class=""></div><div>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:</div><div class=""><br class=""></div><div class=""><div class="">/// - Precondition: the pointee at `self + i` is initialized.</div><div class="">should read</div><div class="">/// - Precondition: either the pointee at `self + i` is initialized</div><div class="">/// or `Pointee` is a trivial type.</div></div><div class=""><br class=""></div><div class=""><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md#trivial-types" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md#trivial-types</a></div><div class=""><br class=""></div><div class="">-Andy</div></body></html>