On 09/29/2010 07:39 AM, André Bjärby wrote: > The following cobe generates a warning "dereferencing type-punned > pointer will break strict-aliasing rules" in function foo(). When I > add an intermediate variable (as in function bar()) the warning > disappears. > > #include <stdint.h> > > typedef struct blob_St { > uint32_t length; > char data[0] __attribute__ ((aligned (sizeof (uint32_t))));; > } blob_t; > > > int > foo (blob_t *arg) > { > return *(uint32_t*)arg->data == 10; > } > > int > bar (blob_t *arg) > { > uint32_t *tmp; > > tmp = (uint32_t*)arg->data; > return *tmp == 10; > } > > > This code was compiled using 'gcc -c -Wall test.c -O2'. With gcc > version 4.4 I get the error, with versions 4.3 and 4.1 I don't. > > My questions are: > 1. Why does the error disappear when I use an intermediate variable? Because gcc doesn't do full data-flow analysis. > 2. Do I run the risk of generating incorrent code if using an > intermediate variable and compiling with strict aliasing? Yes. Andrew.