glsl/list: Fix undefined behaviour of foreach_* macros
authorDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Tue, 10 Mar 2020 12:21:34 +0000 (14:21 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 14 Apr 2020 19:29:38 +0000 (19:29 +0000)
commit600c91fed89fb6c9389bcbdd41fe50893cfb984a
tree7f05a36276c381f9cac78e3b35bee76b3d89d067
parent23be2160713a713a53519568efa2516b770f07ae
glsl/list: Fix undefined behaviour of foreach_* macros

These macros produced a lot of errors with ubsan preventing us from
expanding the ubsan coverage on CIs.

C++ spec has such clause:

 "If the prvalue of type "pointer to cv1 B" points to a B that is
  actually a subobject of an object of type D, the resulting pointer
  points to the enclosing object of type D. Otherwise, the result
  of the cast is undefined."

Ubsan error example:

 ../src/compiler/glsl/builtin_functions.cpp:4945:4: runtime error: downcast of address 0x559b926abb50 which does not point to an object of type 'ir_instruction'
 0x559b926abb50: note: object has invalid vptr
  9b 55 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  58 ba 6a 92 9b 55 00 00  01 00 00 00
               ^~~~~~~~~~~~~~~~~~~~~~~
               invalid vptr
     #0 0x559b914dbe1a in call ../src/compiler/glsl/builtin_functions.cpp:4945

Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Acked-by: Matt Turner <mattst88@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4129>
src/compiler/glsl/list.h
src/compiler/glsl/tests/list_iterators.cpp [new file with mode: 0644]
src/compiler/glsl/tests/meson.build