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

Jens Persson jens at bitcycle.com
Fri Aug 5 15:05:48 CDT 2016


Thanks, +1 for rewriting it like that.
/Jens

On Fri, Aug 5, 2016 at 9:58 PM, Andrew Trick <atrick at apple.com> 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
>
> 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
>



-- 
bitCycle AB | Smedjegatan 12 | 742 32 Östhammar | Sweden
http://www.bitcycle.com/
Phone: +46-73-753 24 62
E-mail: jens at bitcycle.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160805/821a5dd0/attachment.html>


More information about the swift-dev mailing list