This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Strict aliasing, int aliased with struct containing int
- From: Maxim Mikityanskiy <maxtram95 at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Sun, 4 Jan 2015 11:22:12 +0200
- Subject: Strict aliasing, int aliased with struct containing int
- Authentication-results: sourceware.org; auth=none
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