Open jlanca opened 1 year ago
The binary subtraction operation tp - d is implemented as tp + (-d). Because the unary minus operator is used, the result is wrong if the underlying representation type is unsigned.
tp - d
tp + (-d)
For instance :
#include <cassert> #include <chrono> #include <iostream> #include <boost/chrono.hpp> // namespace chrono = std::chrono; // using std::micro; namespace chrono = boost::chrono; using boost::micro; int main() { const auto tp = chrono::system_clock::time_point(chrono::milliseconds(0)); chrono::duration<uint32_t, micro> delay(1); std::cout << (tp - delay).time_since_epoch().count() << std::endl; assert((tp - delay).time_since_epoch().count() == -1000); return 0; }
Running this program produces the following output:
4294967295000 a: /tmp/a.cpp:16: int main(): Assertion `(tp - delay).time_since_epoch().count() == -1000' failed.
Note that the std::chrono from gcc does not exhibit this defect.
The binary subtraction operation
tp - d
is implemented astp + (-d)
. Because the unary minus operator is used, the result is wrong if the underlying representation type is unsigned.For instance :
Running this program produces the following output:
Note that the std::chrono from gcc does not exhibit this defect.