Skip site navigation (1)Skip section navigation (2)
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>