From 07c3bc01cb31b801a11421e1d41c49b3826d4c7a Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 11 Feb 2013 15:29:57 +0000 Subject: WaE: strict-aliasing issues Change-Id: I394b61fac90e1c2c26b1a4f073b87a5d3ae3e666 Reviewed-on: https://gerrit.libreoffice.org/2105 Reviewed-by: Stephan Bergmann Tested-by: Stephan Bergmann --- cppuhelper/source/typedescriptionprovider.cxx | 66 +++++++++++++++------------ registry/tools/reg2bin.cxx | 31 ++++++++----- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/cppuhelper/source/typedescriptionprovider.cxx b/cppuhelper/source/typedescriptionprovider.cxx index 7e12c292e353..e0d51a18fe93 100644 --- a/cppuhelper/source/typedescriptionprovider.cxx +++ b/cppuhelper/source/typedescriptionprovider.cxx @@ -259,20 +259,23 @@ struct Memory32 { } float getIso60599Binary32() const { - // Create a copy in either case, for alingment: - unsigned char buf[4]; + // Create a copy in either case, for alignment: + union { + unsigned char buf[4]; + float f; + } sa; #if defined OSL_LITENDIAN - buf[0] = byte[0]; - buf[1] = byte[1]; - buf[2] = byte[2]; - buf[3] = byte[3]; + sa.buf[0] = byte[0]; + sa.buf[1] = byte[1]; + sa.buf[2] = byte[2]; + sa.buf[3] = byte[3]; #else - buf[0] = byte[3]; - buf[1] = byte[2]; - buf[2] = byte[1]; - buf[3] = byte[0]; + sa.buf[0] = byte[3]; + sa.buf[1] = byte[2]; + sa.buf[2] = byte[1]; + sa.buf[3] = byte[0]; #endif - return *reinterpret_cast< float * >(buf); + return sa.f; // assuming float is ISO 60599 binary32 } }; @@ -293,28 +296,31 @@ struct Memory64 { } double getIso60599Binary64() const { - // Create a copy in either case, for alingment: - unsigned char buf[8]; + // Create a copy in either case, for alignment: + union { + unsigned char buf[8]; + double d; + } sa; #if defined OSL_LITENDIAN - buf[0] = byte[0]; - buf[1] = byte[1]; - buf[2] = byte[2]; - buf[3] = byte[3]; - buf[4] = byte[4]; - buf[5] = byte[5]; - buf[6] = byte[6]; - buf[7] = byte[7]; + sa.buf[0] = byte[0]; + sa.buf[1] = byte[1]; + sa.buf[2] = byte[2]; + sa.buf[3] = byte[3]; + sa.buf[4] = byte[4]; + sa.buf[5] = byte[5]; + sa.buf[6] = byte[6]; + sa.buf[7] = byte[7]; #else - buf[0] = byte[7]; - buf[1] = byte[6]; - buf[2] = byte[5]; - buf[3] = byte[4]; - buf[4] = byte[3]; - buf[5] = byte[2]; - buf[6] = byte[1]; - buf[7] = byte[0]; + sa.buf[0] = byte[7]; + sa.buf[1] = byte[6]; + sa.buf[2] = byte[5]; + sa.buf[3] = byte[4]; + sa.buf[4] = byte[3]; + sa.buf[5] = byte[2]; + sa.buf[6] = byte[1]; + sa.buf[7] = byte[0]; #endif - return *reinterpret_cast< double * >(buf); + return sa.d; // assuming double is ISO 60599 binary64 } }; diff --git a/registry/tools/reg2bin.cxx b/registry/tools/reg2bin.cxx index 2a1ca05152c3..3f42f28fb5bc 100644 --- a/registry/tools/reg2bin.cxx +++ b/registry/tools/reg2bin.cxx @@ -956,27 +956,34 @@ void write64(osl::File & file, sal_uInt64 value) { } void writeIso60599Binary32(osl::File & file, float value) { - unsigned char buf[4]; - *reinterpret_cast< float * >(buf) = value; + union { + unsigned char buf[4]; + float f; + } sa; + sa.f = value; // assuming float is ISO 60599 binary32 #if defined OSL_BIGENDIAN - std::swap(buf[0], buf[3]); - std::swap(buf[1], buf[2]); + std::swap(sa.buf[0], sa.buf[3]); + std::swap(sa.buf[1], sa.buf[2]); #endif - write(file, buf, SAL_N_ELEMENTS(buf)); + write(file, sa.buf, SAL_N_ELEMENTS(sa.buf)); } void writeIso60599Binary64(osl::File & file, double value) { - unsigned char buf[8]; - *reinterpret_cast< double * >(buf) = value; + union + { + unsigned char buf[8]; + float d; + } sa; + sa.d = value; // assuming double is ISO 60599 binary64 #if defined OSL_BIGENDIAN - std::swap(buf[0], buf[7]); - std::swap(buf[1], buf[6]); - std::swap(buf[2], buf[5]); - std::swap(buf[3], buf[4]); + std::swap(sa.buf[0], sa.buf[7]); + std::swap(sa.buf[1], sa.buf[6]); + std::swap(sa.buf[2], sa.buf[5]); + std::swap(sa.buf[3], sa.buf[4]); #endif - write(file, buf, SAL_N_ELEMENTS(buf)); + write(file, sa.buf, SAL_N_ELEMENTS(sa.buf)); } rtl::OString toAscii(rtl::OUString const & name) { -- cgit v1.2.3