From 1d7e0eccc8f2cdba5c8ed592f2ebae307e716171 Mon Sep 17 00:00:00 2001 From: Nicolas Boichat Date: Fri, 4 Apr 2025 12:04:47 +0200 Subject: [PATCH] uucore: parser: num_parser: Do not Underflow/Overflow when parsing 0 Values like 0e18172487393827593258 and 0e-18172487393827593258 should just be parsed as 0, and do not need to return an error. --- .../src/lib/features/parser/num_parser.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/uucore/src/lib/features/parser/num_parser.rs b/src/uucore/src/lib/features/parser/num_parser.rs index 083a6ca05..c072b8702 100644 --- a/src/uucore/src/lib/features/parser/num_parser.rs +++ b/src/uucore/src/lib/features/parser/num_parser.rs @@ -294,8 +294,14 @@ fn construct_extended_big_decimal<'a>( scale: u64, exponent: BigInt, ) -> Result> { - if digits == BigUint::zero() && negative { - return Ok(ExtendedBigDecimal::MinusZero); + if digits == BigUint::zero() { + // Return return 0 if the digits are zero. In particular, we do not ever + // return Overflow/Underflow errors in that case. + return Ok(if negative { + ExtendedBigDecimal::MinusZero + } else { + ExtendedBigDecimal::zero() + }); } let sign = if negative { Sign::Minus } else { Sign::Plus }; @@ -712,6 +718,24 @@ mod tests { ExtendedBigDecimal::MinusZero )) )); + + // But no Overflow/Underflow if the digits are 0. + assert_eq!( + ExtendedBigDecimal::extended_parse(&format!("0e{}", i64::MAX as u64 + 2)), + Ok(ExtendedBigDecimal::zero()), + ); + assert_eq!( + ExtendedBigDecimal::extended_parse(&format!("-0.0e{}", i64::MAX as u64 + 3)), + Ok(ExtendedBigDecimal::MinusZero) + ); + assert_eq!( + ExtendedBigDecimal::extended_parse(&format!("0.0000e{}", i64::MIN)), + Ok(ExtendedBigDecimal::zero()), + ); + assert_eq!( + ExtendedBigDecimal::extended_parse(&format!("-0e{}", i64::MIN + 2)), + Ok(ExtendedBigDecimal::MinusZero) + ); } #[test]