Casting pointers

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Aug 26 06:13:32 PDT 2015


On Wednesday 26 August 2015 14:14, John Burton wrote:

> This would be undefined behavior in c++ due to aliasing rules on
> pointers. It appears to "work" reliably in D when I try it, but
> that's obviously no guarantee that it's correct or will continue
> to do so.
> 
> Is this correct code in D? And if not, what should I do instead
> to cleanly and efficiently extract structured data from a
> sequence of bytes?
> 
> import std.stdio;
> 
> struct data
> {
>      int a;
>      int b;
> }
> 
> void main()
> {
>      byte[] x = [1, 2, 3, 4, 5, 6, 7, 8];
> 
>      data* ptr = cast(data*)(x);
>      printf("%x %x\n", ptr.a, ptr.b);
> 
> }

There's an open issue about it:
https://issues.dlang.org/show_bug.cgi?id=10750

I don't know where we stand exactly, but by the looks of it, strict aliasing 
has never been added to the spec. So compilers should not assume it.

As David Nadlinger points out: "There is already quite a lot of D code out 
there that violates the C-style strict aliasing rules."

I think that code should be fine for now. If it isn't, we have a problem, 
because with a silent spec we have no way of knowing what alternatives 
should work.


More information about the Digitalmars-d-learn mailing list