Fixed strict-aliasing warning in FloatTraits.hpp

This commit is contained in:
Benoit Blanchon
2019-02-28 12:10:42 +01:00
parent a0011ba7f8
commit f483b06735
2 changed files with 34 additions and 3 deletions

View File

@ -0,0 +1,31 @@
// 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 Internals {
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 Internals
} // namespace ArduinoJson

View File

@ -7,6 +7,7 @@
#include <stdint.h>
#include <stdlib.h> // for size_t
#include "../Configuration.hpp"
#include "../Polyfills/alias_cast.hpp"
#include "../Polyfills/math.hpp"
namespace ArduinoJson {
@ -99,8 +100,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);
}
};
@ -147,7 +147,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() {