From 9e33d71834416b7eddadae2b0f68e85f04cd0c7f Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 11 Aug 2023 18:10:29 +0100 Subject: libstdc++: Do not call log10(0.0) in std::format [PR110860] Calling log10(0.0) returns -inf which has undefined behaviour when converted to an integer. We only need to use log10 for large values anyway. If the value is zero then the larger buffer is only needed due to a large precision, so we don't need to use log10 to estimate the number of digits for the significand. libstdc++-v3/ChangeLog: PR libstdc++/110860 * include/std/format (__formatter_fp::format): Do not call log10 with zero values. --- libstdc++-v3/include/std/format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libstdc++-v3/include') diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format index 2fe430f..23da6b0 100644 --- a/libstdc++-v3/include/std/format +++ b/libstdc++-v3/include/std/format @@ -1490,7 +1490,7 @@ namespace __format // If the buffer is too small it's probably because of a large // precision, or a very large value in fixed format. size_t __guess = 8 + __prec; - if (__fmt == chars_format::fixed) // +ddd.prec + if (__fmt == chars_format::fixed && __v != 0) // +ddd.prec { if constexpr (is_same_v<_Fp, float>) __guess += __builtin_log10f(__v < 0.0f ? -__v : __v); -- cgit v1.1