Fix undefined behavior in OFFSET(). Accessing members of a null pointer is undefined behavior, even when only used to obtain the address again. So use a non-zero value as the base pointer address instead. 32 was chosen to provide sufficient alignment guarantees. Bug b/119823623 Change-Id: Ia6d24dd6c2740261948860c45eb35cc489a3a827 Reviewed-on: https://swiftshader-review.googlesource.com/c/22788 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp index cd08ed5..837df46 100644 --- a/src/Common/Types.hpp +++ b/src/Common/Types.hpp
@@ -151,7 +151,10 @@ return v; } - #define OFFSET(s,m) (int)(size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m)) + // The OFFSET macro is a generalization of the offsetof() macro defined in <cstddef>. + // It allows e.g. getting the offset of array elements, even when indexed dynamically. + // We cast the address '32' and subtract it again, because null-dereference is undefined behavior. + #define OFFSET(s,m) ((int)(size_t)&reinterpret_cast<const volatile char&>((((s*)32)->m)) - 32) } #endif // sw_Types_hpp