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