[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