From ef5d6eae9b2d8a6a594dd98c73faf9d52412f7fa Mon Sep 17 00:00:00 2001 From: Viste Date: Wed, 18 Mar 2020 22:07:59 +0300 Subject: [PATCH] Core/Misc: Remove dependency on undefined behaviour (#2678) Co-authored-by: Ujp8LfXBJ6wCPR Co-authored-by: Ujp8LfXBJ6wCPR --- .../Collision/BoundingIntervalHierarchy.h | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/common/Collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h index 2262feb8a..8623bbec3 100644 --- a/src/common/Collision/BoundingIntervalHierarchy.h +++ b/src/common/Collision/BoundingIntervalHierarchy.h @@ -18,29 +18,26 @@ #include #include #include +#include "string.h" #define MAX_STACK_SIZE 64 +// https://stackoverflow.com/a/4328396 + static inline uint32 floatToRawIntBits(float f) { - union - { - uint32 ival; - float fval; - } temp; - temp.fval=f; - return temp.ival; + static_assert(sizeof(float) == sizeof(uint32), "Size of uint32 and float must be equal for this to work"); + uint32 ret; + memcpy(&ret, &f, sizeof(float)); + return ret; } static inline float intBitsToFloat(uint32 i) { - union - { - uint32 ival; - float fval; - } temp; - temp.ival=i; - return temp.fval; + static_assert(sizeof(float) == sizeof(uint32), "Size of uint32 and float must be equal for this to work"); + float ret; + memcpy(&ret, &i, sizeof(uint32)); + return ret; } struct AABound