OSDN Git Service

Fix undefined behavior in OFFSET().
authorNicolas Capens <capn@google.com>
Thu, 22 Nov 2018 15:32:35 +0000 (10:32 -0500)
committerNicolas Capens <nicolascapens@google.com>
Fri, 23 Nov 2018 01:32:31 +0000 (01:32 +0000)
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>
src/Common/Types.hpp

index cd08ed5..837df46 100644 (file)
@@ -151,7 +151,10 @@ namespace sw
                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