|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |