mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-10-28 03:20:15 +01:00
fix undefined double to uint64_t cast
note that std::numeric_limits<uint64_t>::max() and std::numeric_limits<int64_t>::max() aren't exactly representable in a double, so we need to be strictly less to be definitely lossless UBSAN gave during Value.IsLosslessDouble test: include/rapidjson/document.h:955:42: runtime error: value 1.84467e+19 is outside the range of representable values of type 'unsigned long'
This commit is contained in:
@@ -673,6 +673,7 @@ TEST(Value, Float) {
|
||||
}
|
||||
|
||||
TEST(Value, IsLosslessDouble) {
|
||||
EXPECT_TRUE(Value(0.0).IsLosslessDouble());
|
||||
EXPECT_TRUE(Value(12.34).IsLosslessDouble());
|
||||
EXPECT_TRUE(Value(-123).IsLosslessDouble());
|
||||
EXPECT_TRUE(Value(2147483648u).IsLosslessDouble());
|
||||
@@ -681,8 +682,19 @@ TEST(Value, IsLosslessDouble) {
|
||||
EXPECT_TRUE(Value(RAPIDJSON_UINT64_C2(0xA0000000, 0x00000000)).IsLosslessDouble());
|
||||
#endif
|
||||
|
||||
EXPECT_FALSE(Value(-static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF))).IsLosslessDouble());
|
||||
EXPECT_FALSE(Value(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)).IsLosslessDouble());
|
||||
EXPECT_FALSE(Value(static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF))).IsLosslessDouble()); // INT64_MAX
|
||||
EXPECT_FALSE(Value(-static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF))).IsLosslessDouble()); // -INT64_MAX
|
||||
EXPECT_TRUE(Value(-static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF)) - 1).IsLosslessDouble()); // INT64_MIN
|
||||
EXPECT_FALSE(Value(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)).IsLosslessDouble()); // UINT64_MAX
|
||||
|
||||
EXPECT_TRUE(Value(3.4028234e38f).IsLosslessDouble()); // FLT_MAX
|
||||
EXPECT_TRUE(Value(-3.4028234e38f).IsLosslessDouble()); // -FLT_MAX
|
||||
EXPECT_TRUE(Value(1.17549435e-38f).IsLosslessDouble()); // FLT_MIN
|
||||
EXPECT_TRUE(Value(-1.17549435e-38f).IsLosslessDouble()); // -FLT_MIN
|
||||
EXPECT_TRUE(Value(1.7976931348623157e+308).IsLosslessDouble()); // DBL_MAX
|
||||
EXPECT_TRUE(Value(-1.7976931348623157e+308).IsLosslessDouble()); // -DBL_MAX
|
||||
EXPECT_TRUE(Value(2.2250738585072014e-308).IsLosslessDouble()); // DBL_MIN
|
||||
EXPECT_TRUE(Value(-2.2250738585072014e-308).IsLosslessDouble()); // -DBL_MIN
|
||||
}
|
||||
|
||||
TEST(Value, IsLosslessFloat) {
|
||||
|
||||
Reference in New Issue
Block a user