From 086f1fb36727b13cb1d450e401918d20e134feab Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Fri, 5 May 2023 13:25:08 -0500 Subject: [PATCH] GH-1062 Add a safe_add that does not overflow. --- libraries/libfc/include/fc/time.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/libfc/include/fc/time.hpp b/libraries/libfc/include/fc/time.hpp index d2d0dfc80a..7e2c88c51c 100644 --- a/libraries/libfc/include/fc/time.hpp +++ b/libraries/libfc/include/fc/time.hpp @@ -49,6 +49,16 @@ namespace fc { std::string to_iso_string()const; static time_point from_iso_string( const std::string& s ); + // protect against overflow + constexpr time_point& safe_add( const microseconds& m ) { + if (m.count() > 0 && elapsed > fc::microseconds::maximum() - m) { + elapsed = microseconds::maximum(); + } else { // does not guard against underflow + elapsed += m; + } + return *this; + } + constexpr const microseconds& time_since_epoch()const { return elapsed; } constexpr uint32_t sec_since_epoch()const { return elapsed.count() / 1000000; } constexpr bool operator > ( const time_point& t )const { return elapsed._count > t.elapsed._count; }