> ...
> 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).
paul