Strict aliasing, int aliased with struct containing int
Maxim Mikityanskiy
maxtram95@gmail.com
Sun Jan 4 09:22:00 GMT 2015
Hello!
I'm trying to understand strict aliasing rules, and I have some
questions. Of course, I tried googling a lot first, but my
understanding contradicts with GCC behavior, so I got stucked.
It's worth noting that I'm using GCC 4.9.2 on x86_64 and write code in
C. I compile it with -O3, so -fstrict-aliasing is implied.
According to C99 (6.5/7):
An object shall have its stored value accessed only by an lvalue
expression that has one of the following types:
- a type compatible with the effective type of the object,
<...>
- an aggregate or union type that includes one of the aforementioned
types among its members (including, recursively, a member of a
subaggregate or contained union), or
<...>
As far as I understand this text, it's allowed to access int object
using pointer to struct that contains int field. But running the
following code on my machine shown unexpected results:
#include <stdio.h>
int global;
struct aggregate {
int value;
char arr[1];
};
int modify(struct aggregate *param)
{
global = 1;
param->value = 2;
return global;
}
int main()
{
printf("%d\n", modify((struct aggregate *)&global));
return 0;
}
I access the same int object two ways:
- via variable "global"
- via field "value" of "struct aggregate" by pointer "param"
As far as I understood, according to C99, struct type that includes
int may be used to access int object. But the test program prints "1"
when I expect it to print "2". And if I remove "char arr[1]" field
from struct, the test program prints "1" as expected. I can't
understand where I went wrong.
Please shed some light on this strange behavior.
Thanks in advance,
Maxim Mikityanskiy
More information about the Gcc-help
mailing list