Considering this code: void dummy(void *x); union union_t { unsigned un; char c; } __attribute__((packed));
unsigned foo() { char x[4]; dummy(x); return ((union union_t*)x)->un; } unsigned bar(char *x) { return ((union union_t*)x)->un; } With gcc-4.4 -Wstrict-aliasing=1 is the only one that does *not* give a warning, levels 2 and 3 do give warnings: $ gcc-4.4 -Wstrict-aliasing p.c -O2 -c p.c: In function foo: p.c:11: warning: dereferencing type-punned pointer will break strict-aliasing rules $ gcc-4.4 -Wstrict-aliasing=2 p.c -O2 -c p.c: In function foo: p.c:11: warning: dereferencing type-punned pointer will break strict-aliasing rules $ gcc-4.4 -Wstrict-aliasing=1 p.c -O2 -c However in the case of gcc-4.3, -Wstrict-aliasing=2 is the only one that gives warnings, levels 1 and 3 give no warning: $ gcc-4.3 -Wstrict-aliasing p.c -O2 -c $ gcc-4.3 -Wstrict-aliasing=2 p.c -O2 -c p.c: In function foo: p.c:11: warning: dereferencing type-punned pointer might break strict-aliasing rules $ gcc-4.3 -Wstrict-aliasing=1 p.c -O2 -c According to the gcc manpage -Wstrict-aliasing=3 should have the fewest false positives and false negatives, yet with gcc-4.4 -Wstrict-aliasing=3 gives a warning that is not given at -Wstrict-aliasing=1 (the one that is supposed to have many false positives). This only happens if 'x' is allocated on the stack, gcc-4.4 is perfectly happy if it is a char* argument to the function. I've also tried the 'Casting through a union (1)' described at http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasing.html but that too gives warnings by default. Conclusion is that with gcc-4.4 -O2 -Wall there is no way to read/store from a stack allocated variable through a union, using a different type member of the union without raising a warning. Is there another recommended way in gcc-4.4 to cast from uint8_t* to uint32_t*? -- Summary: gcc-4.4 -Wstrict-aliasing and -Wstrict-aliasing=3 behaves like -Wstrict-aliasing=2 in gcc-4.3 Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: edwintorok at gmail dot com GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39895