Harti Brandt writes: > On Mon, 11 Nov 2002, TOMITA Yoshinori wrote: > > This is probably not a bug, but a feature. You are not expected to access > a variable through a pointer to a non-compatible type. int and short are > not compatible. (see your ISO C standard on this topic). > > Try to use ntohl(), htonl() for your problem. >
On a similar theme, I assume the following is also not safe: static __inline u_int64_t __bswap64 (u_int64_t x) { u_int64_t ret; u_int32_t *x_ptr, *ret_ptr; x_ptr = (u_int32_t *)&x; ret_ptr = (u_int32_ *)&ret; ret_ptr[0] = __bswap32 (x_ptr[1]); ret_ptr[1] = __bswap32 (x_ptr[0]); return ret; } But does using a union make it safe? static __inline u_int64_t __bswap64 (u_int64_t x) { union { u_int64_t u64; u_int32_t u32[2]; } ret, old; old.u64 = x; ret.u32[0] = __bswap32 (old.u32[1]); ret.u32[1] = __bswap32 (old.u32[0]); return ret.u64; } FWIW, both *seem* to work correctly using gcc version 3.2.1 and high optimization. Thanks, Drew To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-current" in the body of the message