From 4601136b0876c26105bfc45153128a8dc5065efd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 2 Jun 2018 14:57:16 -0400 Subject: [PATCH] WiimoteDevice: Get rid of pointer casting in CBigEndianBuffer Gets rid of more places where we can violate alignment requirements and aliasing rules. --- .../Core/IOS/USB/Bluetooth/WiimoteDevice.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp b/Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp index 40970ba79c..d805121978 100644 --- a/Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp +++ b/Source/Core/Core/IOS/USB/Bluetooth/WiimoteDevice.cpp @@ -32,11 +32,19 @@ class CBigEndianBuffer public: CBigEndianBuffer(u8* pBuffer) : m_pBuffer(pBuffer) {} u8 Read8(u32 offset) const { return m_pBuffer[offset]; } - u16 Read16(u32 offset) const { return Common::swap16(*(u16*)&m_pBuffer[offset]); } - u32 Read32(u32 offset) const { return Common::swap32(*(u32*)&m_pBuffer[offset]); } + u16 Read16(u32 offset) const { return Common::swap16(&m_pBuffer[offset]); } + u32 Read32(u32 offset) const { return Common::swap32(&m_pBuffer[offset]); } void Write8(u32 offset, u8 data) { m_pBuffer[offset] = data; } - void Write16(u32 offset, u16 data) { *(u16*)&m_pBuffer[offset] = Common::swap16(data); } - void Write32(u32 offset, u32 data) { *(u32*)&m_pBuffer[offset] = Common::swap32(data); } + void Write16(u32 offset, u16 data) + { + const u16 swapped = Common::swap16(data); + std::memcpy(&m_pBuffer[offset], &swapped, sizeof(u16)); + } + void Write32(u32 offset, u32 data) + { + const u32 swapped = Common::swap32(data); + std::memcpy(&m_pBuffer[offset], &swapped, sizeof(u32)); + } u8* GetPointer(u32 offset) { return &m_pBuffer[offset]; } private: