-fno-strict-aliasing in CWARNFLAGS?

Michael Cree mcree at orcon.net.nz
Wed Feb 3 12:02:29 PST 2010


On 04/02/10 07:55, Soeren Sandmann wrote:
>
> I recently turned it on in pixman because completely reasonable code
> like this:
>
>      void
>      pixman_contract (uint32_t *      dst,
>                       const uint64_t *src,
>                       int             width)
>      {
>          int i;
>
>          /* Start at the beginning so that we can do the contraction in
>           * place when src == dst
>           */
>          for (i = 0; i<  width; i++)
>          {
>              const uint8_t a = src[i]>>  56,
>                            r = src[i]>>  40,
>                            g = src[i]>>  24,
>                            b = src[i]>>  8;
>
>              dst[i] = a<<  24 | r<<  16 | g<<  8 | b;
>          }
>      }
>
> is actually illegal under the C aliasing rules, and GCC can and will
> break it unless you use -fno-strict-aliasing.

I'm confused.  Why does this break the aliasing rules?

What I do see is that the variables a, r, g and b are essentially 
declared unsigned char (what I presume uint8_t is typedefed to) and a 
calculation is performed that will lose its intended result due to 
shifting an unsigned char more bits to the left than is available in the 
unsigned char.  I doubt that this code works as intended whether 
-fno-strict-aliasing is defined or not!

Cheers
Michael.


More information about the xorg-devel mailing list