SERVER-105931 Remove bsoncolumn_helpers.h from ubsan deny (#37450)

GitOrigin-RevId: 1073f04a1a7c605cff233fe79de7291eded900e7
This commit is contained in:
Binh Vo 2025-06-18 15:12:31 -04:00 committed by MongoDB Bot
parent 46a114042a
commit ba5ca89603
4 changed files with 19 additions and 15 deletions

View File

@ -15,7 +15,6 @@ src:src/third_party/immer/dist/immer/detail/hamts/node.hpp
# s2 compatibility # s2 compatibility
fun:_ZN8S2CellId14FromFaceIJWrapEiii fun:_ZN8S2CellId14FromFaceIJWrapEiii
src:src/mongo/bson/column/bsoncolumn_helpers.h
src:src/third_party/abseil-cpp/dist/absl/numeric/int128_have_intrinsic.inc src:src/third_party/abseil-cpp/dist/absl/numeric/int128_have_intrinsic.inc
# SERVER-62972 # SERVER-62972

View File

@ -44,6 +44,7 @@
#include <boost/container/small_vector.hpp> #include <boost/container/small_vector.hpp>
namespace mongo { namespace mongo {
namespace bsoncolumn { namespace bsoncolumn {
/** /**
@ -551,7 +552,7 @@ public:
bsoncolumn::scaleIndexForControlByte(control) == bsoncolumn::scaleIndexForControlByte(control) ==
Simple8bTypeUtil::kMemoryAsInteger); Simple8bTypeUtil::kMemoryAsInteger);
out += simple8b::sum<Encoding>(ptr + 1, size, lastNonRLEBlock); out = simple8b::add(out, simple8b::sum<Encoding>(ptr + 1, size, lastNonRLEBlock));
ptr += 1 + size; ptr += 1 + size;
} }
@ -576,7 +577,8 @@ public:
bsoncolumn::scaleIndexForControlByte(control) == bsoncolumn::scaleIndexForControlByte(control) ==
Simple8bTypeUtil::kMemoryAsInteger); Simple8bTypeUtil::kMemoryAsInteger);
out += simple8b::prefixSum<Encoding>(ptr + 1, size, prefix, lastNonRLEBlock); out = simple8b::add(
out, simple8b::prefixSum<Encoding>(ptr + 1, size, prefix, lastNonRLEBlock));
ptr += 1 + size; ptr += 1 + size;
} }
@ -603,7 +605,8 @@ public:
auto encodedDouble = Simple8bTypeUtil::encodeDouble(last, scaleIndex); auto encodedDouble = Simple8bTypeUtil::encodeDouble(last, scaleIndex);
uassert(9095626, "Invalid double encoding in BSON Column", encodedDouble); uassert(9095626, "Invalid double encoding in BSON Column", encodedDouble);
lastValue = *encodedDouble; lastValue = *encodedDouble;
lastValue += simple8b::sum<int64_t>(ptr + 1, size, lastNonRLEBlock); lastValue =
simple8b::add(lastValue, simple8b::sum<int64_t>(ptr + 1, size, lastNonRLEBlock));
last = Simple8bTypeUtil::decodeDouble(lastValue, scaleIndex); last = Simple8bTypeUtil::decodeDouble(lastValue, scaleIndex);
@ -636,7 +639,7 @@ public:
bsoncolumn::scaleIndexForControlByte(control) == bsoncolumn::scaleIndexForControlByte(control) ==
Simple8bTypeUtil::kMemoryAsInteger); Simple8bTypeUtil::kMemoryAsInteger);
out += simple8b::sum<int128_t>(ptr + 1, size, lastNonRLEBlock); out = simple8b::add(out, simple8b::sum<int128_t>(ptr + 1, size, lastNonRLEBlock));
ptr += 1 + size; ptr += 1 + size;
} }

View File

@ -399,6 +399,18 @@ T sum(const char* buffer, size_t size, uint64_t& prevNonRLE);
*/ */
template <typename T> template <typename T>
T prefixSum(const char* buffer, size_t size, T& prefix, uint64_t& prevNonRLE); T prefixSum(const char* buffer, size_t size, T& prefix, uint64_t& prevNonRLE);
/**
* Helper that performs signed addition as unsigned to get the defined wrap-around overflow behavior
* rather than overflow, which is undefined behavior.
*/
static constexpr int64_t add(int64_t lhs, int64_t rhs) {
return static_cast<int64_t>(static_cast<uint64_t>(lhs) + static_cast<uint64_t>(rhs));
}
static constexpr int128_t add(int128_t lhs, int128_t rhs) {
return static_cast<int128_t>(static_cast<uint128_t>(lhs) + static_cast<uint128_t>(rhs));
}
} // namespace simple8b } // namespace simple8b
} // namespace mongo } // namespace mongo

View File

@ -37,16 +37,6 @@ namespace {
// Sentinel to represent missing, this value is not encodable in simple8b // Sentinel to represent missing, this value is not encodable in simple8b
static constexpr int64_t kMissing = std::numeric_limits<int64_t>::max(); static constexpr int64_t kMissing = std::numeric_limits<int64_t>::max();
// Performs addition as unsigned and cast back to signed to get overflow defined to wrapped around
// instead of undefined behavior.
static constexpr int64_t add(int64_t lhs, int64_t rhs) {
return static_cast<int64_t>(static_cast<uint64_t>(lhs) + static_cast<uint64_t>(rhs));
}
static constexpr int128_t add(int128_t lhs, int128_t rhs) {
return static_cast<int128_t>(static_cast<uint128_t>(lhs) + static_cast<uint128_t>(rhs));
}
// Simple Simple8b decoder for decoding any basic simple8b block where all bits are used for the // Simple Simple8b decoder for decoding any basic simple8b block where all bits are used for the
// value, decodes signed integer at runtime. Suitable for selectors with many bits per slot. Encoded // value, decodes signed integer at runtime. Suitable for selectors with many bits per slot. Encoded
// should be be machine endian and first slot should start at least significant bit. // should be be machine endian and first slot should start at least significant bit.