diff options
author | Henrik Edin <henrik.edin@mongodb.com> | 2021-08-19 12:24:49 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-08-20 12:23:58 +0000 |
commit | e358ace0ef2fbe2290d69daa2586461fc71e3014 (patch) | |
tree | 3990829be96e7a0bc32469393ceebd1aff1e9bdc /src/mongo/bson | |
parent | 1973dd31e526cdaa6d7e1d2d47f77ec6c9f35701 (diff) | |
download | mongo-e358ace0ef2fbe2290d69daa2586461fc71e3014.tar.gz |
SERVER-59446 Use memcpy instead of reinterpret_cast for doing bit casting between types
Diffstat (limited to 'src/mongo/bson')
-rw-r--r-- | src/mongo/bson/util/simple8b_type_util.cpp | 14 | ||||
-rw-r--r-- | src/mongo/bson/util/simple8b_type_util_test.cpp | 5 |
2 files changed, 14 insertions, 5 deletions
diff --git a/src/mongo/bson/util/simple8b_type_util.cpp b/src/mongo/bson/util/simple8b_type_util.cpp index 8858552e8ae..61787104f9b 100644 --- a/src/mongo/bson/util/simple8b_type_util.cpp +++ b/src/mongo/bson/util/simple8b_type_util.cpp @@ -133,8 +133,11 @@ boost::optional<uint8_t> Simple8bTypeUtil::calculateDecimalShiftMultiplier(doubl } boost::optional<int64_t> Simple8bTypeUtil::encodeDouble(double val, uint8_t scaleIndex) { - if (scaleIndex == kMemoryAsInteger) - return *reinterpret_cast<int64_t*>(&val); + if (scaleIndex == kMemoryAsInteger) { + int64_t ret; + memcpy(&ret, &val, sizeof(ret)); + return ret; + } // Checks for both overflow and handles NaNs // We use 2^53 because this is the max integer that we can guarentee can be @@ -160,8 +163,11 @@ boost::optional<int64_t> Simple8bTypeUtil::encodeDouble(double val, uint8_t scal } double Simple8bTypeUtil::decodeDouble(int64_t val, uint8_t scaleIndex) { - if (scaleIndex == kMemoryAsInteger) - return *reinterpret_cast<double*>(&val); + if (scaleIndex == kMemoryAsInteger) { + double ret; + memcpy(&ret, &val, sizeof(ret)); + return ret; + } return val / kScaleMultiplier[scaleIndex]; } diff --git a/src/mongo/bson/util/simple8b_type_util_test.cpp b/src/mongo/bson/util/simple8b_type_util_test.cpp index 6275839b4f4..5d4e3051dce 100644 --- a/src/mongo/bson/util/simple8b_type_util_test.cpp +++ b/src/mongo/bson/util/simple8b_type_util_test.cpp @@ -261,7 +261,10 @@ TEST(Simple8bTypeUtil, InterpretAsMemory) { boost::optional<int64_t> result = Simple8bTypeUtil::encodeDouble(val, Simple8bTypeUtil::kMemoryAsInteger); ASSERT_TRUE(result); - ASSERT_EQ(*result, *reinterpret_cast<const int64_t*>(&val)); + + int64_t valInt; + memcpy(&valInt, &val, sizeof(valInt)); + ASSERT_EQ(*result, valInt); // Some of the special values above does not compare equal with themselves (signaling NaN). // Verify that we end up with the same memory after decoding |