svn commit: r211023 - head/usr.sbin/syslogd

Bruce Evans brde at optusnet.com.au
Tue Aug 10 11:20:41 UTC 2010


On Mon, 9 Aug 2010, M. Warner Losh wrote:

> In message: <86tyn4tbuc.fsf at ds4.des.no>
>            Dag-Erling Smørgrav <des at des.no> writes:
> : Jilles Tjoelker <jilles at stack.nl> writes:
> : > In other cases, I propose adding a cast to void * in between, like
> : >   (struct sockaddr_in *)(void *)ai->ai_addr
> :
> : Better to cast through uintptr_t.  Perhaps we should have a
> : __DECONST-like macro for this?
> :
> : #define __ALIGNED_CAST(t, v) ((t)(uintptr_t)(v))

__DECONST() shouldn't exist, and this would be another way to break the
warning.

> I like the idea of a macro.  Why is a cast through uintptr_t better?

The bugs in __DECONST() are larger than its existence:
- first, the (const void *) cast in it fails if that cast would cast
   away qualifiers (mainly the volatile qualifier).  Perhaps
   (volatile const void *) would work better.
- next, the `(type)' cast in it fails unless `type' is precisiely `void *'
   or perhaps a qualified variant of that (since [u]intptr_t only has defined
   behaviour if [u]intptr_t exists and is applied to a `void *').

Casting through only uintptr_t is better because it fails in more
cases, (as for `(type)' above, but also for converting uintptr_t), and
anything that prevents use of bogus casts by making them fail is better
:-).

Bruce


More information about the svn-src-head mailing list