From 1472f6d9865eec67230405522bc0b44a681440dc Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Fri, 6 Aug 2021 21:47:49 +0200 Subject: [PATCH] AK: Add formatting for infinity and NaN Without this patch, we would end up printing garbage values when we encountered floating point infinity or NaN values, and also triggered UBSAN with Clang. This added code models `std::format`'s behavior: the sign is added the same way as with normal values and the strings 'nan' and 'inf' are printed. --- AK/Format.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/AK/Format.cpp b/AK/Format.cpp index 08653293c8..a7dc73f4ff 100644 --- a/AK/Format.cpp +++ b/AK/Format.cpp @@ -19,6 +19,7 @@ # include # include #else +# include # include # include #endif @@ -344,6 +345,22 @@ void FormatBuilder::put_f64( StringBuilder string_builder; FormatBuilder format_builder { string_builder }; + if (isnan(value) || isinf(value)) [[unlikely]] { + if (value < 0.0) + string_builder.append('-'); + else if (sign_mode == SignMode::Always) + string_builder.append('+'); + else + string_builder.append(' '); + + if (isnan(value)) + string_builder.append(upper_case ? "NAN"sv : "nan"sv); + else + string_builder.append(upper_case ? "INF"sv : "inf"sv); + format_builder.put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); + return; + } + bool is_negative = value < 0.0; if (is_negative) value = -value; @@ -394,6 +411,22 @@ void FormatBuilder::put_f80( StringBuilder string_builder; FormatBuilder format_builder { string_builder }; + if (isnan(value) || isinf(value)) [[unlikely]] { + if (value < 0.0l) + string_builder.append('-'); + else if (sign_mode == SignMode::Always) + string_builder.append('+'); + else + string_builder.append(' '); + + if (isnan(value)) + string_builder.append(upper_case ? "NAN"sv : "nan"sv); + else + string_builder.append(upper_case ? "INF"sv : "inf"sv); + format_builder.put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); + return; + } + bool is_negative = value < 0.0l; if (is_negative) value = -value;