This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: strict aliasing question
- From: Andrew Haley <aph at redhat dot com>
- To: Howard Chu <hyc at highlandsun dot com>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Fri, 10 Nov 2006 10:49:33 +0000
- Subject: Re: strict aliasing question
- References: <45545354.2000706@highlandsun.com>
Howard Chu writes:
> I see a lot of APIs (e.g. Cyrus SASL) that have accessor functions
> returning values through a void ** argument. As far as I can tell, this
> doesn't actually cause any problems, but gcc 4.1 with -Wstrict-aliasing
> will complain. For example, take these two separate source files:
>
> alias1.c
> ####
>
> #include <stdio.h>
>
> extern void getit( void **arg );
>
> main() {
> int *foo;
>
> getit( (void **)&foo);
> printf("foo: %x\n", *foo);
This is not legal C. You are dereferencing a pointer to a type other
than the object that it points to.
This would have been quite legal, albeit implementation defined:
void **foo;
getit(foo);
printf("foo: %x\n", (int)*foo);
> }
> ####
>
>
> alias2.c
> ####
> static short x[] = {16,16};
>
> void getit( void **arg ) {
> *arg = x;
This is fine.
> }
> ####
>
> gcc -O3 -fstrict-aliasing -Wstrict-aliasing *.c -o alias
>
> The program prints the expected result with both strict-aliasing and
> no-strict-aliasing on my x86_64 box. As such, when/why would I need to
> worry about this warning?
Always. This isn't C code, and the compiler may not generate the code
you expect for it.
This has been explained countless times before. It certainly isn't a
suitable topic for the gcc mailing list, which is for development of
gcc, not help using it. Redirected to gcc-help.
Please read Section 6.3.2.3 of ISO9899:1999, in particular Para. 7.
Andrew.