Problem report: Struct aliasing problem causes Thread_Ready_Chain corruption in 4.6.99.3

Thomas Doerfler Thomas.Doerfler at embedded-brains.de
Mon Dec 4 20:16:24 UTC 2006


Kim,

when I look into the current RTEMS networking stack, you are right.
There we find:

struct sockaddr {
	unsigned char	sa_len;			/* total length */
	sa_family_t	sa_family;		/* address family */
	char	sa_data[14];		/* actually longer; address value */
};

struct sockaddr_in {
	uint8_t	sin_len;
	sa_family_t	sin_family;
	in_port_t	sin_port;
	struct	in_addr sin_addr;
	char	sin_zero[8];
};

sockaddr_in is sometimes overlayed by sockaddr, which is definitively
non-aliased.

IMHO we might come over this, by defining
struct sockaddr_in {
	struct sockaddr sa;
	in_port_t	sin_port;
	struct	in_addr sin_addr;
	char	sin_zero[8];
};

But then, the semantics to access elements in the "general" header would
change, which would break a huge amount of code dealing with sockets.
And would make them non-standard, I would guess.

You may come around this when you are writing application code, because
then you will work with ONE type of socket at a given piece of code, but
I am not sure how we can get over this without (partially) disabling the
aliasing optimizations...

Any hints?

wkr,
Thomas.


Kim Barrett schrieb:
> At 8:30 AM -0800 12/4/06, Till Straumann wrote:
>> While the optimization is optional, programs that violate the
>> aliasing rule are unfortunately not C99 compliant - the
>> standard does *not* declare this rule optional, unfortunately.
> 
> De-lurking briefly, in this very interesting discussion, to ask:
> 
> Am I confused, or is POSIX riddled with strict-aliasing violations?
> 
> I'm thinking, for example, of the struct sockaddr variants, where
> one allocates space for a sockaddr_in or sockaddr_un or whatever,
> but often passes it around as a (cast to) sockaddr*. While sockaddr
> has a "common initial sequence" (C99 6.5.2.3 para5) with sockaddr_in
> &etc, there is nothing I can find that would indicate that they are
> "compatible types" (C99 6.2.7 &etc), and 6.7.7 example 2 seems to
> explicitly indicate that they are not.
> 
> And since the aliasing rules are written in terms of "compatible
> types", this makes me suspicious.
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users


-- 
--------------------------------------------
embedded brains GmbH
Thomas Doerfler           Obere Lagerstr. 30
D-82178 Puchheim          Germany
Tel. : +49-89-18 90 80 79-2
Fax  : +49-89-18 90 80 79-9
email: Thomas.Doerfler at embedded-brains.de
PGP public key available on request



More information about the users mailing list