From 1eb9ce4b8f313b23eb52c00293e7f7043aaf7b7d Mon Sep 17 00:00:00 2001 From: arash andishgar Date: Wed, 10 Dec 2025 15:47:58 +0330 Subject: [PATCH 1/2] apply changes --- cpp/src/arrow/util/ubsan.h | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/cpp/src/arrow/util/ubsan.h b/cpp/src/arrow/util/ubsan.h index 2308ee33519..4751637336e 100644 --- a/cpp/src/arrow/util/ubsan.h +++ b/cpp/src/arrow/util/ubsan.h @@ -21,8 +21,10 @@ #include #include +#include #include +#include "arrow/util/aligned_storage.h" #include "arrow/util/macros.h" namespace arrow { @@ -55,16 +57,23 @@ 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(), std::launder(reinterpret_cast(unaligned)), + sizeof(T)); + auto data = *raw_data.get(); + raw_data.destroy(); + return data; } template @@ -72,9 +81,13 @@ 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(), std::launder(reinterpret_cast(&value)), + sizeof(T)); + auto data = *raw_data.get(); + raw_data.destroy(); + return data; } template From dff4b7c9c3b1972d80c1e8fc9f07c73ac2e0b194 Mon Sep 17 00:00:00 2001 From: arash andishgar Date: Wed, 10 Dec 2025 16:29:40 +0330 Subject: [PATCH 2/2] remove launder --- cpp/src/arrow/util/ubsan.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cpp/src/arrow/util/ubsan.h b/cpp/src/arrow/util/ubsan.h index 4751637336e..5c6a8f419bb 100644 --- a/cpp/src/arrow/util/ubsan.h +++ b/cpp/src/arrow/util/ubsan.h @@ -21,7 +21,6 @@ #include #include -#include #include #include "arrow/util/aligned_storage.h" @@ -69,8 +68,7 @@ template inline std::enable_if_t, T> SafeLoad(const T* unaligned) { using Type = std::remove_const_t; arrow::internal::AlignedStorage raw_data; - std::memcpy(raw_data.get(), std::launder(reinterpret_cast(unaligned)), - sizeof(T)); + std::memcpy(raw_data.get(), static_cast(unaligned), sizeof(T)); auto data = *raw_data.get(); raw_data.destroy(); return data; @@ -83,8 +81,7 @@ inline std::enable_if_t && SafeCopy(T value) { using TypeU = std::remove_const_t; arrow::internal::AlignedStorage raw_data; - std::memcpy(raw_data.get(), std::launder(reinterpret_cast(&value)), - sizeof(T)); + std::memcpy(raw_data.get(), static_cast(&value), sizeof(T)); auto data = *raw_data.get(); raw_data.destroy(); return data;