diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp index 051a682e..73c8bbd8 100644 --- a/src/ArduinoJson/Numbers/FloatTraits.hpp +++ b/src/ArduinoJson/Numbers/FloatTraits.hpp @@ -7,6 +7,7 @@ #include // for size_t #include #include "../Configuration.hpp" +#include "../Polyfills/alias_cast.hpp" #include "../Polyfills/math.hpp" namespace ARDUINOJSON_NAMESPACE { @@ -98,8 +99,7 @@ struct FloatTraits { // we use this function to workaround platforms with single precision literals // (for example, when -fsingle-precision-constant is passed to GCC) static T forge(uint32_t msb, uint32_t lsb) { - uint64_t bits = (uint64_t(msb) << 32) | lsb; - return *reinterpret_cast(&bits); + return alias_cast((uint64_t(msb) << 32) | lsb); } }; @@ -146,7 +146,7 @@ struct FloatTraits { } static T forge(uint32_t bits) { - return *reinterpret_cast(&bits); + return alias_cast(bits); } static T nan() { diff --git a/src/ArduinoJson/Polyfills/alias_cast.hpp b/src/ArduinoJson/Polyfills/alias_cast.hpp new file mode 100644 index 00000000..41c04a76 --- /dev/null +++ b/src/ArduinoJson/Polyfills/alias_cast.hpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include +#include // for size_t +#include "../Configuration.hpp" +#include "../Polyfills/math.hpp" + +namespace ARDUINOJSON_NAMESPACE { + +template +struct alias_cast_t { + union { + F raw; + T data; + }; +}; + +template +T alias_cast(F raw_data) { + alias_cast_t ac; + ac.raw = raw_data; + return ac.data; +} +} // namespace ARDUINOJSON_NAMESPACE