From b7c497474b548b1c84e12e28501d857724bcf523 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 2 May 2025 09:57:47 -0300 Subject: [PATCH] x86: Fix UB in isnanl Building with --enable-ubasn triggers: $ math/test-ldouble-roundeven UBSAN: Undefined behaviour in ../sysdeps/ieee754/ldbl-96/s_roundl.c:75:28 left shift of 1 by 31 cannot be represented in type 'int' Also adds the inputs that triggers it on isnan testcase. --- math/libm-test-isnan.inc | 2 ++ sysdeps/x86/fpu/s_isnanl.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/math/libm-test-isnan.inc b/math/libm-test-isnan.inc index 980aa5119f..72d2ad210e 100644 --- a/math/libm-test-isnan.inc +++ b/math/libm-test-isnan.inc @@ -23,6 +23,8 @@ static const struct test_f_i_data isnan_test_data[] = TEST_f_b (isnan, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_b (isnan, minus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_b (isnan, 10, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_f_b (isnan, 4294967297, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_f_b (isnan, -4294967297, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_b (isnan, min_subnorm_value, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_b (isnan, -min_subnorm_value, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_b (isnan, min_value, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), diff --git a/sysdeps/x86/fpu/s_isnanl.c b/sysdeps/x86/fpu/s_isnanl.c index 41484bf654..69e34b8aaf 100644 --- a/sysdeps/x86/fpu/s_isnanl.c +++ b/sysdeps/x86/fpu/s_isnanl.c @@ -26,12 +26,13 @@ static char rcsid[] = "$NetBSD: $"; int __isnanl(long double x) { - int32_t se,hx,lx,pn; + int se; + unsigned int hx,lx,pn; GET_LDOUBLE_WORDS(se,hx,lx,x); se = (se & 0x7fff) << 1; /* Detect pseudo-normal numbers, i.e. exponent is non-zero and the top bit of the significand is not set. */ - pn = (uint32_t)((~hx & 0x80000000) & (se|(-se)))>>31; + pn = ((~hx & 0x80000000) & (se|(-se)))>>31; /* Clear the significand bit when computing mantissa. */ lx |= hx & 0x7fffffff; se |= (uint32_t)(lx|(-lx))>>31; -- 2.47.2