mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 11:39:15 +00:00
Fix undefined behaviour with unaligned loads in syzygy code
Casting a pointer to a different type with stricter alignment requirements yields to implementation dependent behaviour. Practicaly everything is fine for common platforms because the CPU/OS/compiler will generate correct code, but anyhow it is better to be safe than sorry. Testing with dbg_hit_on() shows that the unalignment accesses are very rare (below 0.1%) so it makes sense to split the code in a fast path for the common case and a slower path as a fallback. No functional change (verified with TB enabled).
This commit is contained in:
parent
f5d3f0ded6
commit
876f07cbee
1 changed files with 7 additions and 1 deletions
|
@ -239,7 +239,13 @@ template<typename T, int LE> T number(void* addr)
|
||||||
const union { uint32_t i; char c[4]; } Le = { 0x01020304 };
|
const union { uint32_t i; char c[4]; } Le = { 0x01020304 };
|
||||||
const bool IsLittleEndian = (Le.c[0] == 4);
|
const bool IsLittleEndian = (Le.c[0] == 4);
|
||||||
|
|
||||||
T v = *((T*)addr);
|
T v;
|
||||||
|
|
||||||
|
if ((uintptr_t)addr & (alignof(T) - 1)) // Unaligned pointer (very rare)
|
||||||
|
std::memcpy(&v, addr, sizeof(T));
|
||||||
|
else
|
||||||
|
v = *((T*)addr);
|
||||||
|
|
||||||
if (LE != IsLittleEndian)
|
if (LE != IsLittleEndian)
|
||||||
swap_byte(v);
|
swap_byte(v);
|
||||||
return v;
|
return v;
|
||||||
|
|
Loading…
Add table
Reference in a new issue