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