diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-04-30 13:44:22 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-05-03 08:45:34 +0000 |
commit | 4c39e08e16e672a8b93061ff5e241873abef6fc4 (patch) | |
tree | 7727780cd3919d0b54e9d2c26cc1520f9633d25a /src/3rdparty | |
parent | 20a8ef2d9a1af79f7a6b2896764c62aaae1de4b8 (diff) |
Fix UBSAN warnings in masm
Change-Id: Ie86307fe55fce957adf48e9861022fddfa3d7374
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/3rdparty')
-rw-r--r-- | src/3rdparty/masm/assembler/AssemblerBuffer.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/X86Assembler.h | 20 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/3rdparty/masm/assembler/AssemblerBuffer.h b/src/3rdparty/masm/assembler/AssemblerBuffer.h index 277ec1043c..45874235b6 100644 --- a/src/3rdparty/masm/assembler/AssemblerBuffer.h +++ b/src/3rdparty/masm/assembler/AssemblerBuffer.h @@ -102,7 +102,7 @@ namespace JSC { void putIntegralUnchecked(IntegralType value) { ASSERT(isAvailable(sizeof(IntegralType))); - *reinterpret_cast_ptr<IntegralType*>(m_buffer + m_index) = value; + memcpy(m_buffer + m_index, &value, sizeof(IntegralType)); m_index += sizeof(IntegralType); } diff --git a/src/3rdparty/masm/assembler/X86Assembler.h b/src/3rdparty/masm/assembler/X86Assembler.h index b71cf290f8..6fa66e0dd7 100644 --- a/src/3rdparty/masm/assembler/X86Assembler.h +++ b/src/3rdparty/masm/assembler/X86Assembler.h @@ -1892,9 +1892,18 @@ public: ASSERT(to.isSet()); char* code = reinterpret_cast<char*>(m_formatter.data()); - ASSERT(!reinterpret_cast<int32_t*>(code + from.m_offset)[-1]); + ASSERT(!loadPossiblyUnaligned<int32_t>(code, from.m_offset, -1)); setRel32(code + from.m_offset, code + to.m_offset); } + + template<typename T> + T loadPossiblyUnaligned(char *ptr, size_t offset, int idx) + { + T *t_ptr = &reinterpret_cast<T*>(ptr + offset)[idx]; + T val; + memcpy(&val, t_ptr, sizeof(T)); + return val; + } static void linkJump(void* code, AssemblerLabel from, void* to) { @@ -2095,7 +2104,14 @@ private: static void setInt32(void* where, int32_t value) { - reinterpret_cast<int32_t*>(where)[-1] = value; + storePossiblyUnaligned<int32_t>(where, -1, value); + } + + template <typename T> + static void storePossiblyUnaligned(void *where, int idx, T value) + { + T *ptr = &reinterpret_cast<T*>(where)[idx]; + memcpy(ptr, &value, sizeof(T)); } static void setInt8(void* where, int8_t value) |