Fixed strict-aliasing warning in FloatTraits.hpp

This commit is contained in:
Benoit Blanchon
2019-02-28 15:37:42 +01:00
parent 8dea900869
commit 16ddfbc4e0
2 changed files with 31 additions and 3 deletions

View File

@ -7,6 +7,7 @@
#include <stddef.h> // for size_t
#include <stdint.h>
#include "../Configuration.hpp"
#include "../Polyfills/alias_cast.hpp"
#include "../Polyfills/math.hpp"
namespace ARDUINOJSON_NAMESPACE {
@ -98,8 +99,7 @@ struct FloatTraits<T, 8 /*64bits*/> {
// 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<T*>(&bits);
return alias_cast<T>((uint64_t(msb) << 32) | lsb);
}
};
@ -146,7 +146,7 @@ struct FloatTraits<T, 4 /*32bits*/> {
}
static T forge(uint32_t bits) {
return *reinterpret_cast<T*>(&bits);
return alias_cast<T>(bits);
}
static T nan() {

View File

@ -0,0 +1,28 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2019
// MIT License
#pragma once
#include <stdint.h>
#include <stdlib.h> // for size_t
#include "../Configuration.hpp"
#include "../Polyfills/math.hpp"
namespace ARDUINOJSON_NAMESPACE {
template <typename T, typename F>
struct alias_cast_t {
union {
F raw;
T data;
};
};
template <typename T, typename F>
T alias_cast(F raw_data) {
alias_cast_t<T, F> ac;
ac.raw = raw_data;
return ac.data;
}
} // namespace ARDUINOJSON_NAMESPACE