On Mon, 2007-01-08 at 15:39 +0000, Andrew Haley wrote: > Michael Haubenwallner writes: > > Hi, > > > > after switching to gcc-4.1.1 from gcc-3.4.5, I'm facing a problem with > > this code searching for non-blank in a string (extracted test-case): > > > > #include <stdio.h> > > int check(const void *pvBuf) > > { > > for(; *((char*)pvBuf) == ' '; ++ *((char**)&pvBuf)); > > This is wrong. Try this: > > for(; *((char*)pvBuf) == ' '; pvBuf = (char*)pvbuf + 1); Yep, have my code changed like this, thanks. > > > return *((char*)pvBuf); > > } > > int main(void) > > { > > printf("%d\n", check(" x")); > > return 0; > > } > > > > When building without optimization, it works as expected. > > When building with -O2 or higher, the loop hangs. > > This seems to be platform independant, as it occurs on x86-linux as well > > as powerpc-aix, hppa-hpux, ia64-hpux, x86-solaris and sparc-solaris. > > > > Now the question is: > > Is this a user-bug only, not looking at the output of "-Wall" (because > > this code builds and works successfully for 5 years now), > > or is it a gcc-bug too, producing working code without optimization > > and non-working code with optimization level >= 2 ? > > > > And: can this code be changed without using an intermediate variable ? > > This is an aliasing bug. Please see The C standard, Section 6.3.2.3, > Pointers. Hmm, a bug in what product - the standard, gcc, or my application ? And - sorry for that question - where do one read the standard from ? I've found C89, this seems to have only 5 sections... And in the C99 draft, Section 6.3.2.3 has to do with aliasing, but I'm completely lost here - I'll better let interpreting the standard up to you :) > > Alternatively, you may compile your code with -fno-strict-aliasing. Yes, this works too, thanks. /haubi/