> On May 9, 2016, at 1:25 PM, Geordie Jay <[email protected]> wrote:
> 
> So what's in it for us as Swift devs?
> 
> It may be technically undefined behaviour (by that I think you mean there's 
> no real knowing what could happen), but it seems to be rampant throughout 
> pretty much all the C code I've come in contact with (I'm less familiar with 
> C++).

Undefined behavior means that the compiler can optimize as if it couldn't 
happen. For example, in this C code:

        int foo(int *x, float *y) {
                *x = 2;
                *y = 3.0;
                return *x;
        }

the compiler will likely optimize 'foo' to always return 2, since it's allowed 
to assume its pointer parameters x and y are different types so don't alias, If 
code calls `foo` with aliasing pointers such as `foo(&x, (float*)&x)`, it'll 
break.

> If we lose type information by calling a C API that takes a void pointer, how 
> can we hope to retrieve it in any safe way, other than saying "we assume with 
> good reason and hope to hell that this is what we say it is".

This doesn't change anything in that respect. The aliasing rules in C and Swift 
refer to the type of value that's dynamically stored in memory, not the static 
type of a pointer. It's legal to cast a pointer from T* to void* and back to 
T*, and load a T from the resulting pointer, so long as a T value resides in 
the referenced memory at the time the load occurs.

> And if we can't do that, what advantage does this proposal provide over what 
> we already have?

This API gives you a way to legally perform pointer type punning, when you do 
want to reinterpret memory as a different type. In C and C++ the only standard 
way to do so is to `memcpy`.

-Joe

> Joe Groff <[email protected]> schrieb am Mo., 9. Mai 2016 um 22:16:
> 
> > On May 9, 2016, at 12:38 PM, Geordie Jay via swift-evolution 
> > <[email protected]> wrote:
> >
> > I read this proposal and I'm a bit unsure what its purpose would be:
> >
> > Basically you want to prevent UnsafePointer<XYZ>(UnsafePointer<Void>) 
> > conversions and/or vice-versa? And you'd achieve this by replacing 
> > UnsafePointer<Void> with UnsafeBytePointer that has no bound pointer type?
> >
> > In one sense the change seems fine to me, but as someone who uses a lot of 
> > C APIs and a lot of CoreAudio/CoreMIDI in Swift already I can't really see 
> > what benefit it'd bring. Presumably we'd still want an option of converting 
> > UnsafeBytePointer to UnsafePointer<SomeActualType> for things like C 
> > function pointer callback "context"/"userInfo" uses, so it's not like we'd 
> > be preventing programmer error in that way.
> >
> > Call me conservative but to me the current system seems to work as well as 
> > it can. If anything it's already enough boilerplate going through hoops 
> > converting an UnsafeMutablePointer<Void> into a [Float] even when I know 
> > and the C API knows perfectly well what it actually contains... Would 
> > happily be convinced otherwise about this proposal though, I'm pretty new 
> > at all this.
> >
> > Geordie
> 
> > On May 9, 2016, at 12:57 PM, Guillaume Lessard via swift-evolution 
> > <[email protected]> wrote:
> >
> > I’m sympathetic to the elimination of UnsafePointer<Void> as general 
> > shorthand for an arbitrary pointer, but I lose the plot of this very long 
> > proposal. It seems to me that this increases API surface, yet everything I 
> > could do before, I could still do; it just involves more typing. What 
> > exactly does this make better?
> >
> > Cheers,
> > Guillaume Lessard
> 
> Andy, I think it's worth clarifying the primary purpose of this proposal. Our 
> main goal here is to provide a legal means for "type-punning" memory access. 
> Like C and C++, it's technically undefined behavior in Swift to cast an 
> UnsafePointer<T> to an UnsafePointer<U> of a different type and load a value 
> out of memory that's of a different type from what was stored there. We don't 
> take much advantage of this yet in Swift's optimizer, since we don't have 
> good alternative API. UnsafeBytePointer seeks to fill this gap by providing a 
> type that can safely do type-punned loads and stores.
> 
> -Joe

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to