LogEvent: Avoid unaligned assignment of value

Since we can have 'T' be things like int64_t, and we're arbitrarily
incrementing 'mBuf', we're not always assured 'mBuf' will be
properly aligned for an assignment.  We do a check and use
memcpy() if it's going to be unsafe.

Test: TreeHugger
Bug: 148549384
Change-Id: I76fd12a3241a997acf4625c9ce1176ae76c5bff2
This commit is contained in:
Greg Kaiser
2020-01-29 13:48:09 -08:00
parent e9437d2ee3
commit 19a88669c3

View File

@@ -255,7 +255,15 @@ private:
mValid = false;
value = 0; // all primitive types can successfully cast 0
} else {
value = *((T*)mBuf);
// When alignof(T) == 1, hopefully the compiler can optimize away
// this conditional as always true.
if ((reinterpret_cast<uintptr_t>(mBuf) % alignof(T)) == 0) {
// We're properly aligned, and can safely make this assignment.
value = *((T*)mBuf);
} else {
// We need to use memcpy. It's slower, but safe.
memcpy(&value, mBuf, sizeof(T));
}
mBuf += sizeof(T);
mRemainingLen -= sizeof(T);
}