From 16ddfbc4e04e3dc6315ac66bce0ff773623ed906 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 28 Feb 2019 15:37:42 +0100 Subject: [PATCH] Fixed strict-aliasing warning in FloatTraits.hpp --- src/ArduinoJson/Numbers/FloatTraits.hpp | 6 ++--- src/ArduinoJson/Polyfills/alias_cast.hpp | 28 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/ArduinoJson/Polyfills/alias_cast.hpp 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