Jonathan Lennox <lennox@xxxxxxxxxxxxxxx> writes: > void my_get_func(object* the_object) > { > my_user_context* uc; > errcode err; > > /* Breaks strict aliasing rules? */ > err = GetUserContext(the_object, (void**)&uc); > } > > Now, up through GCC 3.2.x, this code produced no warnings. However, as of > GCC 3.3.x, the line > err = GetUserContext(the_object, (void**)&uc); > produces the warning > objectref.c:31: warning: dereferencing type-punned pointer will break strict-aliasing rules > > I have several questions: > 1. Is the function my_get_func() indeed non-conformant C? No. However, GetUserContext is if it actually dereferences its argument. In other words, the warning is correct. > 2. Might GCC actually mis-compile it? (It seems like it would need > inter-module optimization to do so, assuming GetUserContext isn't an > inline function and that all object pointers have the same > representation.) Correct. However, future gccs might have inter-module optimizations. > 3. Is the function my_get_func2() conformant? (It generates no -W -Wall > warnings with GCC 3.2.2.) Looks OK to me. > 4. Is there any way to write this code conformantly without needing the > intermediate void* variable? Have it return the void*, and use NULL to indicate an error. > 5. If not, will GCC (with -O2) always realize that the void* variable is > unnecessary, and optimize it out? Very likely yes. You could check the assembly to verify. -- Falk