[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/2] xen-detect: fix strict-aliasing compilation warning.



On 01/12/14 14:37, John Haxby wrote:
> With gcc 4.8.3, compiling xen-detect gives a compilation warning if
> you're optimising:
>
> $ cc -Wall -Os xen-detect.c
> xen-detect.c: In function âcheck_for_xenâ:
> xen-detect.c:65:9: warning: dereferencing type-punned pointer will break
> strict-aliasing rules [-Wstrict-aliasing]
>          *(uint32_t *)(signature + 0) = regs[1];
>          ^
>
> Signed-off-by: John Haxby <john.haxby@xxxxxxxxxx>

Why are you compiling without the CFLAGS from the Xen build system?

We explicitly disable strict alias optimisations, because optimisations
based upon the aliasing rules in C is mad.  Even when you eliminate all
the warnings, there are still subtle bugs because the compiler is free
to assume a lot more than a programmer would typically deem reasonable.

~Andrew

> ---
>  tools/misc/xen-detect.c | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/tools/misc/xen-detect.c b/tools/misc/xen-detect.c
> index 787b5da..19c66d1 100644
> --- a/tools/misc/xen-detect.c
> +++ b/tools/misc/xen-detect.c
> @@ -54,28 +54,27 @@ static void cpuid(uint32_t idx, uint32_t *regs, int 
> pv_context)
>  
>  static int check_for_xen(int pv_context)
>  {
> -    uint32_t regs[4];
> -    char signature[13];
> +    union
> +    {
> +        uint32_t regs[4];
> +        char signature[17];
> +    } u;
>      uint32_t base;
>  
>      for ( base = 0x40000000; base < 0x40010000; base += 0x100 )
>      {
> -        cpuid(base, regs, pv_context);
> -
> -        *(uint32_t *)(signature + 0) = regs[1];
> -        *(uint32_t *)(signature + 4) = regs[2];
> -        *(uint32_t *)(signature + 8) = regs[3];
> -        signature[12] = '\0';
> +        cpuid(base, u.regs, pv_context);
> +        u.signature[16] = '\0';
>  
> -        if ( !strcmp("XenVMMXenVMM", signature) && (regs[0] >= (base + 2)) )
> +        if ( !strcmp("XenVMMXenVMM", u.signature+4) && (u.regs[0] >= (base + 
> 2)) )
>              goto found;
>      }
>  
>      return 0;
>  
>   found:
> -    cpuid(base + 1, regs, pv_context);
> -    return regs[0];
> +    cpuid(base + 1, u.regs, pv_context);
> +    return u.regs[0];
>  }
>  
>  static jmp_buf sigill_jmp;



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.