Andrew Haley wrote:
> On 01/10/2010 02:39 PM, Paul Koning wrote:
>>> ... 
>>> typedef unsigned char uint8_t;
>>> typedef unsigned int uint32_t;
>>>
>>> struct in6_addr
>>> {
>>>   uint8_t __s6_addr[16];
>>> };
>>>
>>> static inline int
>>> address_in_use (unsigned char *a, struct in6_addr *in6)
>>> {
>>>   if ((((const uint32_t *)(a))[0]
>>>                 == ((const uint32_t *)(in6->__s6_addr))[0]
>>>     && ((const uint32_t *)(a))[1]
>>>                 == ((const uint32_t *)(in6->__s6_addr))[1]
>>>     && ((const uint32_t *)(a))[2]
>>>                 == ((const uint32_t *)(in6->__s6_addr))[2]
>>>     && ((const uint32_t *)(a))[3]
>>>                 == ((const uint32_t *)(in6->__s6_addr))[3]))
>>>     return 1;
>>>
>>>   return 0;
>>> }
>> That code seems to be broken for reasons other than aliasing -- it can
>> easily give alignment errors on platforms that require natural alignment
>> (because an in6_addr object might be allocated at an odd address).
> 
> It that case, the allocator would be broken.  But the breakage isn't
> here, it's in the allocator.  I don't think there's anything wrong
> with this code.

  Yes, and regardless; the compiler doesn't need to worry about that, it just
needs to make the assumption that it /is/ aligned (since it is allowed to
assume I will not invoke undefined behaviour).

    cheers,
      DaveK

Reply via email to