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 Sat, Nov 23, 2013 at 12:59:04AM -0500, Mouse wrote:
> > Note that the bog-standard (struct sockaddr *) cast that one needs
> > and conventionally uses to call bind(2), connect(2), accept(2), and
> > similar is, strictly speaking, illegal.
>
> I don't think so. The aliasing rules don't say anything about the
> types used when passing around pointers to an object, only about the
> types used when actually accessing it.
Indeed. But it *is* accessed via both types. That the kernel copies it
before accessing it doesn't (AIUI) matter. The compiler is not in a
position to see both ends of this at once; but that's why I said
"strictly speaking".
> To be type-correct, the various structs sockaddr_* really need to be a
> single discriminated union...and I'm not sure sockaddr_un can ever be
> done type-correctly; I'd have to think about it more.)
Why not? Worst case is that your union is size PATH_MAX plus a bit.
> (some further notes skipped, no disagreement)
>
> > I think it can be done by sticking an anonymous union into
> > TAILQ_HEAD,
>
> I'm not sure, since storing through one union member and fetching
> through another brings back issues. I'd need to see details to do more
> than take guesses, though, of course.
I believe that was explicitly legalized in C99 TC3.
> > but of course anonymous unions aren't supported until C11.
>
> Or gcc; I think gcc had anonymous unions before C11, didn't it?
It's had them for ages and ages, yeah.
--
David A. Holland
dholland%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index