Give an error on precision overflow

This commit is contained in:
Victor Zverovich 2019-12-14 07:45:27 -08:00
parent 068d20bc31
commit 9e450911fa
2 changed files with 9 additions and 1 deletions

View File

@ -1715,7 +1715,12 @@ template <typename Range> class basic_writer {
return;
}
int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6;
if (fspecs.format == float_format::exp) ++precision;
if (fspecs.format == float_format::exp) {
if (precision == max_value<int>())
FMT_THROW(format_error("number is too big"));
else
++precision;
}
if (const_check(std::is_same<T, float>())) fspecs.binary32 = true;
fspecs.use_grisu = use_grisu<T>();
if (const_check(FMT_DEPRECATED_PERCENT) && fspecs.percent) value *= 100;

View File

@ -1236,6 +1236,9 @@ TEST(FormatterTest, Precision) {
EXPECT_THROW_MSG(format("{0:.2f}", reinterpret_cast<void*>(0xcafe)),
format_error,
"precision not allowed for this argument type");
EXPECT_THROW_MSG(format("{:.{}e}", 42.0, fmt::internal::max_value<int>()),
format_error,
"number is too big");
EXPECT_EQ("st", format("{0:.2}", "str"));
}