On Sunday, 29 January 2012 at 14:05:25 UTC, Daniel Murphy wrote:
"Denis Shelomovskij" <[email protected]> wrote in message news:[email protected]...
It was originally posted to D.learn but there was no reply. So:

Is there a strict aliasing rule in D?

I just saw https://bitbucket.org/goshawk/gdc/changeset/b44331053062

Struct aliasing is required when doing array operations.

eg.
int[] a, b, c;
a[] = b[] + c[];

The arrays used must not overlap.
I'm pretty sure that's what that commit was about.

That's not strict aliasing, that's just a language rule about aliasing for vector ops.

Strict aliasing is the assumption that no two pointers of different types point to the same location (char is an exception). For example, with -fstrict-aliasing in gcc, the following could generate unexpected code:

int* i = new int;
float* f = (float*)i;
*i = 0;
*f = 1.0f;
printf("%d\n", *i); // could still write 0

Because of strict aliasing, the compiler may assume that the assignment *f = 1.0f can't affect the int, so it could just print out 0 instead of whatever 1.0f is as an int. To get around it, you would have to either use a union (which is still implementation defined, but works around aliasing), or make i volatile.

As for D, I can't see anything in the standard that prevents two pointers of different types from pointing to the same location, but I suspect it is an assumption that is being made.

Reply via email to