Bug#1010760: minetest: Floating point serialization error on x86
Nils Dagsson Moskopp
nils+debian-reportbug at dieweltistgarnichtso.net
Mon May 9 13:36:18 BST 2022
Package: minetest
Version: 5.3.0+repack-2.1+deb11u1
Severity: normal
Tags: patch upstream
X-Debbugs-Cc: nils+debian-reportbug at dieweltistgarnichtso.net
Dear Maintainer,
Minetest in versions lower than 5.5.0 is being miscompiled by GCC on
x86. To verify this bug, run Minetest using “minetest --run-unittests”
on x86 and look for the following three lines:
Test assertion failed: readF1000(is) == 53.534f
at test_serialization.cpp:308
[FAIL] testStreamRead - 0ms
The reason for this is that the x87 FPU computes in 80bit precision by
default, while IEEE-754 requires 64 bit precision.
There exist two ways to solve this. Upstream forces SSE2 for floating
point calculations, by adding the following to CMakeLists.txt on x86:
--- start of patch ---
# use SSE for floating-point operations to avoid issues with improper fp-rounding and loss of precision
# when moving fp-data to incompatible or less-precise registers/storage locations
# see https://gcc.gnu.org/wiki/FloatingPointMath and https://gcc.gnu.org/wiki/x87note
add_compile_options(-mfpmath=sse -msse2)
--- end of patch ---
A non-SSE2 way is to achieve this is to use the compiler option “-mpc64”.
Both achieve the same goal, calculating with 64 bit precision instead of
doing calculations with 80 bit precision and then rounding the result to
64 bit (which makes the unit test fail).
I therefore suggest to instead try the following to CMakeLists.txt on x86:
--- start of patch ---
# Limit x87 FPU to 64 bit precision to avoid floating point precision
# errors. See both https://gcc.gnu.org/wiki/FloatingPointMath and
# https://gcc.gnu.org/wiki/x87note for more details about this.
add_compile_options(-mpc64)
--- end of patch ---
If you use the latter, verify that this makes the testStreamRead not fail.
There is no need to upstream this change, as it has already been fixed
in Minetest 5.5.0, but since it affects serialization, it might lead to
some crashes or maybe even security bugs if Minetest 5.3.x and 5.4.x are
being distributed in ways that floating point calculations are miscompiled.
For full context, see <https://github.com/minetest/minetest/issues/11810>.
-- System Information:
Debian Release: 11.3
APT prefers stable
APT policy: (900, 'stable'), (500, 'oldoldstable')
Architecture: i386 (i686)
Kernel: Linux 5.10.0-10-686 (SMP w/2 CPU threads)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages minetest depends on:
ii libc6 2.31-13+deb11u3
ii libcurl3-gnutls 7.74.0-1.3+deb11u1
ii libfreetype6 2.10.4+dfsg-1
ii libgcc-s1 10.2.1-6
ii libgmp10 2:6.2.1+dfsg-1+deb11u1
ii libirrlicht1.8 1.8.4+dfsg1-1.1
ii libjsoncpp24 1.9.4-4
ii libleveldb1d 1.22-3
ii libluajit-5.1-2 2.1.0~beta3+dfsg-5.3
ii libncursesw6 6.2+20201114-2
ii libopenal1 1:1.19.1-2
ii libpq5 13.5-0+deb11u1
ii libspatialindex6 1.9.3-2
ii libsqlite3-0 3.34.1-3
ii libstdc++6 10.2.1-6
ii libtinfo6 6.2+20201114-2
ii libvorbisfile3 1.3.7-1
ii libx11-6 2:1.7.2-1
ii minetest-data 5.3.0+repack-2.1+deb11u1
ii zlib1g 1:1.2.11.dfsg-2
minetest recommends no packages.
Versions of packages minetest suggests:
pn minetest-mod-moreblocks <none>
pn minetest-mod-moreores <none>
pn minetest-mod-pipeworks <none>
pn minetest-server <none>
pn minetestmapper <none>
-- no debconf information
More information about the Pkg-games-devel
mailing list