[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 17:15, Andrew Cooper wrote:
> 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.

Do you want me to repost the second patch (the actual bug fix one) so
that it doesn't assume the line number changes and whatnot for this one?

jch


> 
> ~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
> 


_______________________________________________
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®.