I had a discussion with someone on IRC and this question turned up. We are allowed by the Standard to change an object of type int
by a char
lvalue.
int a;
char *b = (char*) &a;
*b = 0;
Would we be allowed to do this in the opposite direction, if we know that the alignment is fine?
The issue I'm seeing is that the aliasing rule does not cover the simple case of the following, if one considers the aliasing rule as a non-symmetric relation
int a;
a = 0;
The reason is, that each object contains a sequence of sizeof(obj)
unsigned char
objects (called the "object representation"). If we change the int
, we will change some or all of those objects. However, the aliasing rule only states we are allowed to change a int
by an char
or unsigned char
, but not the other way around. Another example
int a[1];
int *ra = a;
*ra = 0;
Only one direction is described by 3.10/15 ("An aggregate or union type that includes..."), but this time we need the other way around ("A type that is the element or non-static data member type of an aggregate...").
Is the other direction implied? This question also applies to C.