From e57aa7e70a326659529d02891abb9a57b055fc0c Mon Sep 17 00:00:00 2001 From: Yoctopuce dev Date: Thu, 19 Jun 2025 15:47:13 +0200 Subject: py/obj: Fix nan handling in object REPR_C and REPR_D. CPython math.nan is positive with regards to copysign. The signaling bit (aka sign flag) was incorrectly set. In addition, REPR_C and REPR_D should only use the _true_ nan to prevent system crash in case of hand-crafted floats. For instance, with REPR_C, any nan-like float following the pattern `01111111 1xxxxxxx xxxxxxxx xxxxx1xx` would be switched to an immediate object or a qstr string. When the qstr index is too large, this would cause a crash. This commit fixes the issue, and adds the relevant test cases. Signed-off-by: Yoctopuce dev --- py/modmath.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'py/modmath.c') diff --git a/py/modmath.c b/py/modmath.c index b792d8581d..919a8ccd9d 100644 --- a/py/modmath.c +++ b/py/modmath.c @@ -161,6 +161,11 @@ MATH_FUN_2(atan2, atan2) MATH_FUN_1_TO_INT(ceil, ceil) // copysign(x, y) static mp_float_t MICROPY_FLOAT_C_FUN(copysign_func)(mp_float_t x, mp_float_t y) { + #if MICROPY_PY_MATH_COPYSIGN_FIX_NAN + if (isnan(y)) { + y = 0.0; + } + #endif return MICROPY_FLOAT_C_FUN(copysign)(x, y); } MATH_FUN_2(copysign, copysign_func) -- cgit v1.2.3