[Libreoffice-commits] core.git: cppuhelper/source registry/tools
Caolán McNamara
caolanm at redhat.com
Mon Feb 11 07:49:04 PST 2013
cppuhelper/source/typedescriptionprovider.cxx | 66 ++++++++++++++------------
registry/tools/reg2bin.cxx | 31 +++++++-----
2 files changed, 55 insertions(+), 42 deletions(-)
New commits:
commit 07c3bc01cb31b801a11421e1d41c49b3826d4c7a
Author: Caolán McNamara <caolanm at redhat.com>
Date: Mon Feb 11 15:29:57 2013 +0000
WaE: strict-aliasing issues
Change-Id: I394b61fac90e1c2c26b1a4f073b87a5d3ae3e666
Reviewed-on: https://gerrit.libreoffice.org/2105
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
Tested-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/cppuhelper/source/typedescriptionprovider.cxx b/cppuhelper/source/typedescriptionprovider.cxx
index 7e12c29..e0d51a1 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 2a1ca05..3f42f28 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) {
More information about the Libreoffice-commits
mailing list