Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 Mar 2006 23:52:26 +0100
From:      Maxime Henrion <mux@FreeBSD.org>
To:        Joseph Koshy <jkoshy@FreeBSD.ORG>
Cc:        cvs-src@FreeBSD.org, src-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/sys queue.h
Message-ID:  <20060304225226.GS55746@elvis.mu.org>
In-Reply-To: <20060304154259.8A7BE16A422@hub.freebsd.org>
References:  <200603031854.k23IsXeJ062568@repoman.freebsd.org> <20060304154259.8A7BE16A422@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Joseph Koshy wrote:
> 
> > mux         2006-03-03 18:54:33 UTC
> > 
> >   FreeBSD src repository
> > 
> >   Modified files:
> >     sys/sys              queue.h 
> >   Log:
> >   Cast the pointer to void * before casting it back to struct type * in
> >   STAILQ_LAST.  This quiets a warning from GCC about increased required
> >   alignment for the cast.
> >   
> >   Idea from:      cognet
> 
> Doesn't this trade a compile time warning for a runtime fault on those
> architectures where alignment matters?

It doesn't, or the STAILQ_LAST macro simply wouldn't work on those
architectures, and we know it does work.

> Which code triggers this warning? 
> 
>  274 #define STAILQ_LAST(head, type, field)                                 \
>  275         (STAILQ_EMPTY((head)) ?                                        \
>  276                 NULL :                                                 \
>  277                 ((struct type *)                                       \
>  278                 ((char *)((head)->stqh_last) - __offsetof(struct type, field))))

It is apparently the cast to char * that makes GCC unhappy, because we
later cast back to struct type * which has different alignment
constraints than char *, obviously.  We cannot just remove the cast to
char * since it is needed to perform pointer arithmetic.  I have no idea
why a simple cast to void * is sufficient to shut him up but I'm not
going to complain :-).

> I can't see how this code would trigger a warning in normal usage.

Well, write a snippet of code that uses STAILQ_LAST and try to compile
it with -O2 and WARNS=6 on alpha and see by yourself.  Or look at the
last tinderbox failure e-mails for alpha.

Cheers,
Maxime



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060304225226.GS55746>