bug report: https://savannah.nongnu.org/bugs/?66214
turn out a one-liner fix is adequate, so I added a patch: https://repo.or.cz/tinycc.git/commitdiff/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95 diff --git a/tccgen.c<https://repo.or.cz/tinycc.git/blob/57bc493f2bef310fe24853ae6e854e6410c37be0?f=tccgen.c> b/tccgen.c<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tccgen.c> index 57bc493<https://repo.or.cz/tinycc.git/blob/57bc493f2bef310fe24853ae6e854e6410c37be0?f=tccgen.c>..9431582<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tccgen.c> 100644 (file) --- a/tccgen.c<https://repo.or.cz/tinycc.git/blob/57bc493f2bef310fe24853ae6e854e6410c37be0?f=tccgen.c> +++ b/tccgen.c<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tccgen.c> @@ -3249,7<https://repo.or.cz/tinycc.git/blob/57bc493f2bef310fe24853ae6e854e6410c37be0?f=tccgen.c#l3249> +3249,10<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tccgen.c#l3249> @@ error: vtop->c.i = (vtop->c.ld != 0); } else { if(sf) - vtop->c.i = vtop->c.ld; + /* the range of [int64_t] is enough to hold the integer part of any float value. + Meanwhile, converting negative double to unsigned integer is UB. + So first convert to [int64_t] here. */ + vtop->c.i = (int64_t)vtop->c.ld; else if (sbt_bt == VT_LLONG || (PTR_SIZE == 8 && sbt == VT_PTR)) ; else if (sbt & VT_UNSIGNED) diff --git a/tests/tests2/134_double_to_signed.c b/tests/tests2/134_double_to_signed.c<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.c> new file mode 100644 (file) index 0000000..a9f5e0e<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.c> --- /dev/null +++ b/tests/tests2/134_double_to_signed.c<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.c> @@ -0,0 +1,10<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.c#l1> @@ +#include <stdio.h> +int main() { + printf("%d\n", (int)-1.0); + double d = -1.0; + printf("%d\n", (int)d); + + printf("%d\n", (int)-2147483648.0); + d = -2147483648.0; + printf("%d\n", (int)d); +} diff --git a/tests/tests2/134_double_to_signed.expect b/tests/tests2/134_double_to_signed.expect<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.expect> new file mode 100644 (file) index 0000000..468a382<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.expect> --- /dev/null +++ b/tests/tests2/134_double_to_signed.expect<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.expect> @@ -0,0 +1,4<https://repo.or.cz/tinycc.git/blob/b8b6a5fd7b4e8cab8e5a5d01064cf5bf2b5eed95:/tests/tests2/134_double_to_signed.expect#l1> @@ +-1 +-1 +-2147483648 +-2147483648 The UB happens to have correct behavior on x86, so the bug can only be reproduced on other platforms, for example arm64. I tested the fix on amd64 and arm64(M2).
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel