summaryrefslogtreecommitdiff
path: root/src/mongo/bson
diff options
context:
space:
mode:
authorHenrik Edin <henrik.edin@mongodb.com>2021-08-19 12:24:49 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-08-20 12:23:58 +0000
commite358ace0ef2fbe2290d69daa2586461fc71e3014 (patch)
tree3990829be96e7a0bc32469393ceebd1aff1e9bdc /src/mongo/bson
parent1973dd31e526cdaa6d7e1d2d47f77ec6c9f35701 (diff)
downloadmongo-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.cpp14
-rw-r--r--src/mongo/bson/util/simple8b_type_util_test.cpp5
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