On February 14, 2019 12:10:54 AM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >The ubsan pass makes early uninit warning harder (and often doesn't >warn), >because e.g. for enum/bool loads we add instrumentation and the reads >from >the fields isn't easily visible to the uninit pass, we have > _7 = &a.a; > _8 = MEM[(_Bool *)_7]; >instead etc. As the early uninit warning pass shouldn't change the IL >(except for nowarning flags), I think it should be ok to swap the >passes, >first warn and only then do ubsan instrumentation. > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk (or >just for GCC10)?
OK for trunk. Richard. >2019-02-13 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/89284 > * passes.def: Swap pass_ubsan and pass_early_warn_uninitialized. > > * gcc.dg/ubsan/pr89284.c: New test. > >--- gcc/passes.def.jj 2019-01-01 12:37:18.041960447 +0100 >+++ gcc/passes.def 2019-02-13 14:45:20.205700845 +0100 >@@ -56,8 +56,8 @@ along with GCC; see the file COPYING3. > NEXT_PASS (pass_fixup_cfg); > NEXT_PASS (pass_build_ssa); > NEXT_PASS (pass_warn_nonnull_compare); >- NEXT_PASS (pass_ubsan); > NEXT_PASS (pass_early_warn_uninitialized); >+ NEXT_PASS (pass_ubsan); > NEXT_PASS (pass_nothrow); > NEXT_PASS (pass_rebuild_cgraph_edges); > POP_INSERT_PASSES () >--- gcc/testsuite/gcc.dg/ubsan/pr89284.c.jj 2019-02-13 >15:01:25.666165920 +0100 >+++ gcc/testsuite/gcc.dg/ubsan/pr89284.c 2019-02-13 15:01:09.987414305 >+0100 >@@ -0,0 +1,23 @@ >+/* PR middle-end/89284 */ >+/* { dg-do compile } */ >+/* { dg-options "-fsanitize=undefined -O0 -Wuninitialized" } */ >+ >+struct A { _Bool a; int i; }; >+ >+int >+foo (void) >+{ >+ struct A a; >+ if (a.i) /* { dg-warning "'a.i' is used uninitialized in this >function" } */ >+ return 1; >+ return 0; >+} >+ >+int >+bar (void) >+{ >+ struct A a; >+ if (a.a) /* { dg-warning "'a.a' is used uninitialized in this >function" } */ >+ return 1; >+ return 0; >+} > > Jakub