Skip to content

Commit

Permalink
assert floating point is finite internally
Browse files Browse the repository at this point in the history
  • Loading branch information
pauldreik committed May 5, 2019
1 parent 5087774 commit 1f6e341
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
10 changes: 10 additions & 0 deletions include/fmt/chrono.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,12 +431,22 @@ struct chrono_formatter {
explicit chrono_formatter(FormatContext& ctx, OutputIt o,
std::chrono::duration<Rep, Period> d)
: context(ctx), out(o), val(d.count()) {
constexpr bool is_floating_point = std::is_floating_point<Rep>::value;
if (is_floating_point && !std::isfinite(d.count())) {
FMT_THROW(format_error("floating point duration is NaN or Inf"));
}
if (d.count() < 0) {
d = -d;
*out++ = '-';
}

s = std::chrono::duration_cast<seconds>(d);
ms = std::chrono::duration_cast<milliseconds>(d - s);
if (is_floating_point) {
if (!std::isfinite(s.count()) || !std::isfinite(ms.count())) {
FMT_THROW(format_error("internal overflow of floating point duration"));
}
}
}

int hour() const { return to_int(mod((s.count() / 3600), 24)); }
Expand Down
6 changes: 3 additions & 3 deletions test/chrono-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -316,16 +316,16 @@ TEST(ChronoTest, NegativeDuration) {

TEST(ChronoTest, DurationIsFloatNaN) {
const std::chrono::duration<float> d{std::nanf("1")};
auto ignored=fmt::format("{:%I}",d);
EXPECT_THROW(fmt::format("{:%I}",d),fmt::format_error);
}

TEST(ChronoTest, DurationIsDoubleNaN) {
const std::chrono::duration<double> d{std::nan("1")};
auto ignored=fmt::format("{:%I}",d);
EXPECT_THROW(fmt::format("{:%I}",d),fmt::format_error);
}

TEST(ChronoTest, OverflowingFloat) {
const std::chrono::duration<float,std::kilo> d{std::numeric_limits<float>::max()*0.5f};
auto ignored=fmt::format("{:%I}",d);
EXPECT_THROW(fmt::format("{:%I}",d),fmt::format_error);
}
#endif // FMT_STATIC_THOUSANDS_SEPARATOR

0 comments on commit 1f6e341

Please sign in to comment.