From 47ca79ba4bc7e5c18cf9427c975a789efd65a414 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 8 May 2016 23:21:44 -0400 Subject: swap: Get rid of undefined behavior in swapf and swapd This isn't well-defined in C++. --- src/common/swap.h | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/common/swap.h b/src/common/swap.h index f51751d29..beedd6c7e 100644 --- a/src/common/swap.h +++ b/src/common/swap.h @@ -25,6 +25,8 @@ #include #endif +#include + #include "common/common_types.h" // GCC 4.6+ @@ -89,27 +91,29 @@ inline u64 swap64(u64 data) {return ((u64)swap32(data) << 32) | swap32(data >> 3 #endif inline float swapf(float f) { - union { - float f; - unsigned int u32; - } dat1, dat2; + static_assert(sizeof(u32) == sizeof(float), + "float must be the same size as uint32_t."); + + u32 value; + std::memcpy(&value, &f, sizeof(u32)); - dat1.f = f; - dat2.u32 = swap32(dat1.u32); + value = swap32(value); + std::memcpy(&f, &value, sizeof(u32)); - return dat2.f; + return f; } inline double swapd(double f) { - union { - double f; - unsigned long long u64; - } dat1, dat2; + static_assert(sizeof(u64) == sizeof(double), + "double must be the same size as uint64_t."); + + u64 value; + std::memcpy(&value, &f, sizeof(u64)); - dat1.f = f; - dat2.u64 = swap64(dat1.u64); + value = swap64(value); + std::memcpy(&f, &value, sizeof(u64)); - return dat2.f; + return f; } } // Namespace Common -- cgit v1.2.3