Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Jul 2003 14:54:49 -0400
From:      Jake Burkholder <jake@locore.ca>
To:        Jun Kuriyama <kuriyama@imgsrc.co.jp>, Current <freebsd-current@freebsd.org>
Subject:   Re: dereferencing type-punned pointer will break strict-aliasing rules
Message-ID:  <20030728185449.GA396@locore.ca>
In-Reply-To: <20030728015900.GB5628@crow.dom2ip.de>
References:  <7mwue3v6gf.wl@black.imgsrc.co.jp> <20030728015900.GB5628@crow.dom2ip.de>

next in thread | previous in thread | raw e-mail | index | archive | help
Apparently, On Mon, Jul 28, 2003 at 03:59:00AM +0200,
	Thomas Moestl said words to the effect of;

> On Mon, 2003/07/28 at 09:30:08 +0900, Jun Kuriyama wrote:
> > 
> > Is this caused by -oS option?
> > 
> > ----- in making BOOTMFS in make release
> > cc -c -Os -pipe -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes  -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual  -fformat-extensions -std=c99  -nostdinc -I-  -I. -I/usr/src/sys -I/usr/src/sys/dev -I/usr/src/sys/contrib/dev/acpica -I/usr/src/sys/contrib/ipfilter -I/usr/src/sys/contrib/dev/ath -I/usr/src/sys/contrib/dev/ath/freebsd -D_KERNEL -include opt_global.h -fno-common -finline-limit=15000  -mno-align-long-strings -mpreferred-stack-boundary=2 -ffreestanding -Werror  /usr/src/sys/geom/geom_dev.c
> > /usr/src/sys/geom/geom_dev.c: In function `g_dev_open':
> > /usr/src/sys/geom/geom_dev.c:198: warning: dereferencing type-punned pointer will break strict-aliasing rules
> > [...]
> 
> Yes, by implying -fstrict-aliasing, so using -fno-strict-aliasing is a
> workaround. The problem is caused by the i386 PCPU_GET/PCPU_SET
> implementation:
> 
> 	#define	__PCPU_GET(name) ({						\
> 		__pcpu_type(name) __result;					\
> 										\
> 	[...]
> 		} else if (sizeof(__result) == 4) {				\
> 			u_int __i;						\
> 			__asm __volatile("movl %%fs:%1,%0"			\
> 			    : "=r" (__i)					\
> 			    : "m" (*(u_int *)(__pcpu_offset(name))));		\
> 			__result = *(__pcpu_type(name) *)&__i;			\
> 	[...]
> 
> In this case, the PCPU_GET is used to retrieve curthread, causing
> sizeof(__result) to be 4, so the cast at the end of the code snippet
> is from a u_int * to struct thread *, and __i is accessed through the
> casted pointer, which violates the C99 aliasing rules.
> An alternative is to type-pun via a union, which is also a bit ugly,
> but explicitly allowed by C99. Patch attached (but only superficially
> tested).
> 
> 	- Thomas
> 

...

Using a union sounds fine to me.

Jake



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