cvs commit: src/sys/sys queue.h
mux at FreeBSD.org
Sat Mar 4 14:52:27 PST 2006
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.
More information about the cvs-src