This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Strict aliasing, int aliased with struct containing int


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]