Date: Wed, 5 Dec 2007 15:35:24 +1100 (EST) From: Bruce Evans <brde@optusnet.com.au> To: Max Laier <max@love2party.net> Cc: Alexey Dokuchaev <danfe@freebsd.org>, src-committers@freebsd.org, John Baldwin <jhb@freebsd.org>, cvs-src@freebsd.org, cvs-all@freebsd.org, John Birrell <jb@freebsd.org>, Dag-Erling Sm??rgrav <des@des.no> Subject: Re: cvs commit: src/sys/netinet/libalias alias_util.c Message-ID: <20071205151552.T7146@delplex.bde.org> In-Reply-To: <200712041928.36391.max@love2party.net> References: <200711232356.lANNu3mp040885@repoman.freebsd.org> <200712031657.34074.jhb@freebsd.org> <20071204172535.GB82261@FreeBSD.org> <200712041928.36391.max@love2party.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 4 Dec 2007, Max Laier wrote: > On Tuesday 04 December 2007, Alexey Dokuchaev wrote: >> On Mon, Dec 03, 2007 at 04:57:33PM -0500, John Baldwin wrote: >>> On Monday 03 December 2007 10:24:52 am Dag-Erling Sm??rgrav wrote: >>>> John Birrell <jb@FreeBSD.org> writes: >>>>> Log: >>>>> Fix strict alias warnings. >>>> >>>> A much simpler solution (relative to the previous revision): >>>> >>>> @@ -131,10 +131,10 @@ >>>> sum += oddbyte; >>>> } >>>> /* "Pseudo-header" data */ >>>> - ptr = (u_short *) & (pip->ip_dst); >>>> + ptr = (void *)&pip->ip_dst; >>>> sum += *ptr++; >>>> sum += *ptr; >>>> - ptr = (u_short *) & (pip->ip_src); >>>> + ptr = (void *)&pip->ip_src; >>>> sum += *ptr++; >>>> sum += *ptr; >>>> sum += htons((u_short) ntcp); >>> >>> *ptr++ would choke since pointer arith on (void *) is undefined >>> AFAIK. Um, ptr has type `u_short *', not `void *'. The original cast was used to break a warning (and to add 3 style bugs). With stricter type checking, it stopped "working". Now the warning is broken by casting to `void *' which removes all knowledge of alignment restrictions and I suppose must relax aliasing rules (else `void *' couldn't be used for anything). >> I've been under impression that ++ on void * whould simply increase it >> by one. This is a gcc bugfeature. It is disabled by -Wpointer-arith for FreeBSD kernels. > wasn't that the reason why caddr_t exists? i.e. pointer arithmetic on > void * is bad, but on caddr_t it's kinda okay. caddr_t is just an old mistake in this area. The kernel still hasn't caught up with the post K&R-1 (1978) changes which introduced `void *'. (A few places might need to represent "core" addresses that can't be represented by `void *' due to separate address spaces or things like PAE, but that problem is now handed by vm_^Woffset_t, vm_paddr_t and vm_ooffset_t. caddr_t = `char *' has never been able to handle it. "core" mostly means "mapped", so the problem doesn't affect most uses of caddr_t.) Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20071205151552.T7146>