Date: Mon, 11 Nov 2002 09:30:01 -0500 (EST) From: Andrew Gallatin <gallatin@cs.duke.edu> To: Harti Brandt <brandt@fokus.gmd.de> Cc: FreeBSD-current@FreeBSD.ORG Subject: Re: gcc 3.2.1 optimization bug ? Message-ID: <15823.48873.236346.943980@grasshopper.cs.duke.edu> In-Reply-To: <20021111135051.H11404-100000@beagle.fokus.gmd.de> References: <ywlvg34jn21.fsf@cerberus.proc.flab.fujitsu.co.jp> <20021111135051.H11404-100000@beagle.fokus.gmd.de>
next in thread | previous in thread | raw e-mail | index | archive | help
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 majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?15823.48873.236346.943980>
