Date: Tue, 2 May 2017 10:26:17 +0200 From: Nick Hibma <nick@van-laarhoven.org> To: FreeBSD Current Mailing List <freebsd-current@FreeBSD.ORG> Subject: Compiler optimisation bug Message-ID: <3626A28E-9DF5-4775-BAAB-CC6C36D2CD01@van-laarhoven.org>
next in thread | raw e-mail | index | archive | help
--Apple-Mail=_798E884E-DB27-415E-BDBA-9EE6FE0E19FD Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii There is a bug in sbin/dhclient.c for large expiry values on 32 bit = platforms where time_t is a uint32_t (bug #218980, = https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D218980). It is = caused by a compiler optimisation that removes an if-statement. The code = below shows the following output, clearly showing that the optimised = case provides a different answer: % cc -O2 main.c -o main.a && ./main.a no opt: 0x7fffffff with opt: 0xfffffffe rephrased: 0x7fffffff The code is as follows: % cat main.c #include <stdio.h> #include <sys/time.h> #define TIME_MAX 2147483647 time_t a =3D TIME_MAX; time_t b =3D TIME_MAX; time_t add_noopt(time_t a, time_t b) __attribute__((optnone)) { a +=3D b; if (a < b) a =3D TIME_MAX; return a; } time_t add_withopt(time_t a, time_t b) { a +=3D b; if (a < b) a =3D TIME_MAX; return a; } time_t add_rephrased(time_t a, time_t b) { if (a < 0 || a > TIME_MAX - b) a =3D TIME_MAX; else a +=3D b; return a; } int main(int argc, char **argv) { printf("no opt: 0x%08x\n", add_noopt(a, b)); printf("with opt: 0x%08x\n", add_withopt(a, b)); printf("rephrased: 0x%08x\n", add_rephrased(a, b)); } Should this be reported to the clang folks? Or is this to be expected = when abusing integer overflows this way? Also: The underlying problem is the fact that time_t is a 32 bit signed = int. Any pointers as to a general method of resolving these time_t = issues? Regards, Nick Hibma nick@van-laarhoven.org -- Open Source: We stand on the shoulders of giants. --Apple-Mail=_798E884E-DB27-415E-BDBA-9EE6FE0E19FD Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.30 Comment: GPGTools - https://gpgtools.org iQIcBAEBCgAGBQJZCEKpAAoJEB9yHO7GNHbg0ikP/1Ogp7+cmoBQs938GAuI4n1w 9x+f1MHGa4wx4EuJbMRXpjMvnlENuddvLasSQeKoFK+k5exOyd08zkXSIAn7uUix hqwfCPGkgU/Iyan/UGmG4NaS4CgMA4vvdYj0IxMmqNbHW9nBPKtt3NYlcxe/AXfS dR16JJQHjmizSLlSksPFX1/x2g6X26n6ltKTy5KtQ5o1Cr79gVqd3n5YheNfBbF8 FKHmjEadSdAD9j2NUi3pZenGYME7/o11Ptt5V96gORFRQWDFXIs6C2vBTOFFyVy2 LllSe5p77qUk6wd4ZRXbor4C+JJDGzTfRYzT1m+VKM/xuO9lYA4IK9i27EgsyIoA Mfyf5Hof+T7tAczfJUinxYOvSy0fWcdYZ7vZvVcZ4b4d3FQ/J4yo5vaU1BD9Xmz5 x4MfmGgvzlt/IsbaRv0XhF4KbyRAwEYcSDksEGhh3GGkKLNacP5wLgFFLo+DIdPs frluMKpppoH9wwU8nkVJ1VwWzrANyihg9fU+ydkKHtOVpJPeBruWPidUGtQl8cpH SyH+GU+xBQTipV2Dv++XWagsbdJLeMMScKRM7KYlAcygWch7H5B8TbCCSLfn7Jwz 13EJIuCaTcMf1FZntpGqepcUfBCgJCQ3EupC1GjYmQWcSU07jle/4M4llvvz/KKN 8poY2TjRPQjcWDVrp5eD =K/a9 -----END PGP SIGNATURE----- --Apple-Mail=_798E884E-DB27-415E-BDBA-9EE6FE0E19FD--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3626A28E-9DF5-4775-BAAB-CC6C36D2CD01>