diff --git a/cpp/src/arrow/util/ubsan.h b/cpp/src/arrow/util/ubsan.h index 2308ee33519..5c6a8f419bb 100644 --- a/cpp/src/arrow/util/ubsan.h +++ b/cpp/src/arrow/util/ubsan.h @@ -23,6 +23,7 @@ #include #include +#include "arrow/util/aligned_storage.h" #include "arrow/util/macros.h" namespace arrow { @@ -55,16 +56,22 @@ inline T* MakeNonNull(T* maybe_null = NULLPTR) { template inline std::enable_if_t, T> SafeLoadAs( const uint8_t* unaligned) { - std::remove_const_t ret; - std::memcpy(&ret, unaligned, sizeof(T)); - return ret; + using Type = std::remove_const_t; + arrow::internal::AlignedStorage raw_data; + std::memcpy(raw_data.get(), unaligned, sizeof(T)); + auto data = *raw_data.get(); + raw_data.destroy(); + return data; } template inline std::enable_if_t, T> SafeLoad(const T* unaligned) { - std::remove_const_t ret; - std::memcpy(&ret, static_cast(unaligned), sizeof(T)); - return ret; + using Type = std::remove_const_t; + arrow::internal::AlignedStorage raw_data; + std::memcpy(raw_data.get(), static_cast(unaligned), sizeof(T)); + auto data = *raw_data.get(); + raw_data.destroy(); + return data; } template @@ -72,9 +79,12 @@ inline std::enable_if_t && std::is_trivially_copyable_v && sizeof(T) == sizeof(U), U> SafeCopy(T value) { - std::remove_const_t ret; - std::memcpy(&ret, static_cast(&value), sizeof(T)); - return ret; + using TypeU = std::remove_const_t; + arrow::internal::AlignedStorage raw_data; + std::memcpy(raw_data.get(), static_cast(&value), sizeof(T)); + auto data = *raw_data.get(); + raw_data.destroy(); + return data; } template