On Thu, 23 Nov 2017, Jakub Jelinek wrote: > Hi! > > From my reading of the PR and looking around, I believe the reason > ubsan ICEs on mingw hosts is that it is the only host that redefines > HOST_LONG_LONG_FORMAT to "I64" instead of the usual "ll", but "%I64" > is nothing pp_format can handle, and indeed this spot in ubsan.c is > the only place that calls pp_printf with HOST_WIDE_INT_PRINT_DEC > or similar format specifier. Instead, other spots use > pp_unsigned_wide_integer or pp_scalar on top of which it is defined > that does: > sprintf (pp_buffer (PP)->digit_buffer, FORMAT, SCALAR); \ > pp_string (PP, pp_buffer (PP)->digit_buffer); \ > and thus uses the host *printf which handles "I64" and appends that > as a string. > > Bootstrapped/regtested on x86_64-linux and i686-linux, no way to test > on mingw. Ok for trunk?
Ok. Richard. > 2017-11-23 Jakub Jelinek <ja...@redhat.com> > > PR sanitizer/83014 > * ubsan.c (ubsan_type_descriptor): Use pp_unsigned_wide_integer > instead of pp_printf with HOST_WIDE_INT_PRINT_DEC. Avoid calling > tree_to_uhwi twice. > > * gcc.dg/ubsan/pr83014.c: New test. > > --- gcc/ubsan.c.jj 2017-11-13 09:31:33.000000000 +0100 > +++ gcc/ubsan.c 2017-11-23 11:35:20.452162632 +0100 > @@ -436,10 +436,10 @@ ubsan_type_descriptor (tree type, enum u > && TYPE_MAX_VALUE (dom) != NULL_TREE > && TREE_CODE (TYPE_MAX_VALUE (dom)) == INTEGER_CST) > { > + unsigned HOST_WIDE_INT m; > if (tree_fits_uhwi_p (TYPE_MAX_VALUE (dom)) > - && tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1 != 0) > - pp_printf (&pretty_name, HOST_WIDE_INT_PRINT_DEC, > - tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1); > + && (m = tree_to_uhwi (TYPE_MAX_VALUE (dom))) + 1 != 0) > + pp_unsigned_wide_integer (&pretty_name, m + 1); > else > pp_wide_int (&pretty_name, > wi::add (wi::to_widest (TYPE_MAX_VALUE (dom)), 1), > --- gcc/testsuite/gcc.dg/ubsan/pr83014.c.jj 2017-11-23 11:52:59.613932074 > +0100 > +++ gcc/testsuite/gcc.dg/ubsan/pr83014.c 2017-11-23 11:53:30.867542456 > +0100 > @@ -0,0 +1,12 @@ > +/* PR sanitizer/83014 */ > +/* { dg-do compile } */ > +/* { dg-options "-fsanitize=undefined" } */ > + > +int > +foo (void) > +{ > + int data[5]; > + data[0] = 0; > + data[5] = 0; > + return data[0]; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)