From 9df610bbcde89aed4fb71f1fa73d9246ee1fe370 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Wed, 5 Dec 2018 14:41:08 +0100 Subject: XDR: Use unions instead of casts for float/double<->int conversion --- src/os/object/xdrinput.cc | 16 ++++++++++++---- src/os/object/xdrstream.cc | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/os/object/xdrinput.cc b/src/os/object/xdrinput.cc index 5fb17bf..612244e 100644 --- a/src/os/object/xdrinput.cc +++ b/src/os/object/xdrinput.cc @@ -37,14 +37,22 @@ int64_t XDRInput::get_int64() float XDRInput::get_float() { - uint32_t val = get_uint32(); - return *(float*)&val; + union { + uint32_t i; + float f; + } v; + v.i = get_uint32(); + return v.f; } double XDRInput::get_double() { - uint64_t val = get_uint64(); - return *(double*)&val; + union { + uint64_t i; + double d; + } v; + v.i = get_uint64(); + return v.d; } uint32_t XDRInput::get_opaque_length() diff --git a/src/os/object/xdrstream.cc b/src/os/object/xdrstream.cc index 888153b..ad708be 100644 --- a/src/os/object/xdrstream.cc +++ b/src/os/object/xdrstream.cc @@ -70,13 +70,23 @@ XDRStream & XDRStream::operator<<(int64_t number) XDRStream & XDRStream::operator<<(float number) { - *this << *(uint32_t*)&number; + union { + uint32_t i; + float f; + } v; + v.f = number; + *this << v.i; return *this; } XDRStream & XDRStream::operator<<(double number) { - *this << *(uint64_t*)&number; + union { + uint64_t i; + double d; + } v; + v.d = number; + *this << v.i; return *this; } -- cgit v1.2.3