Date: Mon, 15 Feb 2010 19:15:08 +0100 From: Julian Stecklina <jsteckli@os.inf.tu-dresden.de> To: freebsd-current@freebsd.org Subject: Aliasing bug in FICL (may break loader with gcc>4.4) Message-ID: <87tyti8ixf.fsf@monat.inf.tu-dresden.de>
next in thread | raw e-mail | index | archive | help
--==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Transfer-Encoding: quoted-printable Hello, while porting FICL, I noticed an aliasing bug which manifests (at least) with gcc 4.4.2 and 4.4.3 when strict-aliasing is enabled. The root cause is #define LVALUEtoCELL(v) (*(CELL *)&v) in sys/boot/ficl/ficl.h. CELL is a union: typedef union _cell { FICL_INT i; FICL_UNS u; [...] void *p; void (*fn)(void); } CELL; If you compile the attached C file with gcc-4.4.3 and -O3, all stores to i are optimized out and the result is bogus. A ficl built with this gcc is inoperable. Giving the union the may_alias attribute works around this, but is GCC specific (patch is attached). Just using ((CELL)v) does not work without casting all over the place or extending the union. Regards, Julian =2D-=20 "Actually I made up the term 'object-oriented', and I can tell you I did not have C++ in mind." - Alan Kay (OOPSLA 1997 Keynote) --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=ficl-aliasing-bug.patch Content-Transfer-Encoding: quoted-printable =2D-- ficl.h 2010-02-15 18:46:27.020120933 +0100 +++ /home/julian/src/nova/ficl/ficl.h 2010-02-15 18:16:32.370312051 +0100 @@ -269,13 +269,17 @@ #endif void *p; void (*fn)(void); =2D} CELL; +} __attribute__((may_alias)) CELL; =20 /* ** LVALUEtoCELL does a little pointer trickery to cast any CELL sized ** lvalue (informal definition: an expression whose result has an ** address) to CELL. Remember that constants and casts are NOT ** themselves lvalues! +** +** XXX This only works as long as the strict-aliasing rule is +** circumvented (see attribute above). Otherwise GCC >4.4 will +** silently throw away v and just put garbage into the CELL. */ #define LVALUEtoCELL(v) (*(CELL *)&v) =20 --=-=-=-- --==-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) iEYEARECAAYFAkt5jzAACgkQ2EtjUdW3H9k9ewCgyfmYaR7FrkHfD9GI6WYNqfAI ST8AoJ04SnGVNBzWy0laH6sKJ9q/37iE =DXdC -----END PGP SIGNATURE----- --==-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?87tyti8ixf.fsf>