scalapack icon indicating copy to clipboard operation
scalapack copied to clipboard

Build fails with strict-aliasing violations.

Open eli-schwartz opened this issue 11 months ago • 0 comments

I tried building with these flags to optimize my build using LTO: -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing

I got these errors:

[1/887] Building C object CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o
FAILED: CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o 
/usr/bin/mpicc -DAdd_ -Dscalapack_EXPORTS   -march=native -fstack-protector-all -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-clash-protection -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security -fPIC -MD -MT CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o -MF CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o.d -o CMakeFiles/scalapack.dir/SRC/pdlaiect.c.o -c /var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c: In function ‘pdlaiectb_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:142:16: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  142 |    *count = (*((int *)&tmp) >> 31) & 1;
      |               ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:146:21: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  146 |       *count += ((*((int *)&tmp)) >> 31) & 1;
      |                    ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c: In function ‘pdlachkieee_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:270:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  270 |       sbit1 = (*((int *)&pzero) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:271:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  271 |       sbit2 = (*((int *)&pinf) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:294:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  294 |       sbit1 = (*((int *)&nzero) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pdlaiect.c:295:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  295 |       sbit2 = (*((int *)&ninf) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~
cc1: some warnings being treated as errors
[2/887] Building C object CMakeFiles/scalapack.dir/SRC/pslaiect.c.o
FAILED: CMakeFiles/scalapack.dir/SRC/pslaiect.c.o 
/usr/bin/mpicc -DAdd_ -Dscalapack_EXPORTS   -march=native -fstack-protector-all -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-clash-protection -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security -fPIC -MD -MT CMakeFiles/scalapack.dir/SRC/pslaiect.c.o -MF CMakeFiles/scalapack.dir/SRC/pslaiect.c.o.d -o CMakeFiles/scalapack.dir/SRC/pslaiect.c.o -c /var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c: In function ‘pslaiect_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:136:16: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  136 |    *count = (*((int *)&tmp) >> 31) & 1;
      |               ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:140:21: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  140 |       *count += ((*((int *)&tmp)) >> 31) & 1;
      |                    ~^~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c: In function ‘pslachkieee_’:
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:198:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  198 |       sbit1 = (*((int *)&pzero) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:199:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  199 |       sbit2 = (*((int *)&pinf) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:219:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  219 |       sbit1 = (*((int *)&nzero) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~~
/var/tmp/portage/sci-libs/scalapack-2.1.0/work/scalapack-2.1.0/SRC/pslaiect.c:220:18: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
  220 |       sbit2 = (*((int *)&ninf) >> 31) & 1;
      |                 ~^~~~~~~~~~~~~
cc1: some warnings being treated as errors
ninja: build stopped: cannot make progress due to previous errors.

Note that the -Werror=* used is because these indicate cases where the compiler tries to optimize based on assuming that UB cannot exist, and as a result miscompiles code with UB. strict-aliasing in particular can be very bad even without LTO, but LTO makes it much worse.

Previously reported downstream: https://bugs.gentoo.org/862924 Full build logs: build.log

eli-schwartz avatar Mar 05 '24 21:03 eli-schwartz