tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: in which we present an ugly hack to make sys/queue.h CIRCLEQ work



On Thu, Nov 21, 2013 at 08:55:44AM -0500, Ken Hornstein wrote:
 > >On Wed, Nov 20, 2013 at 07:01:15PM -0500, Ken Hornstein wrote:
 > > > #define TAILQ_PREV(elm, headname, field)                             \
 > > >         (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
 > >
 > >There's another wrinkle, however, which is that this code (TAILQ_PREV)
 > >also violates the strict-aliasing rules. I don't think anyone has
 > >found a clear case of gcc (4.8 or otherwise) tripping on it yet, but
 > >it too really ought to be fixed before it bites someone.
 > 
 > I'll be the first one to admit that the strict-aliasing rules are just
 > at the limit of my understanding ... 

Modulo some administrative details, it's just "no object in memory may
be accessed using more than one type".

 > but doesn't that depend on how you use it?

Not in this case; the problem is that the cast to struct headname
causes it to read tqh_last from an item in memory that might be a
queue head but is probably actually a queue element.

As for getting bitten by the violation... that depends on the compiler
doing something that depends on the assumption that you didn't make
such an access.

-- 
David A. Holland
dholland%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index