On Wed, 5 Jun 2013, Marek Polacek wrote: > It works by creating a COMPOUND_EXPR around original expression, so e.g. > it creates: > > if (b < 0 || (b > 31 || a < 0)) > { > __builtin___ubsan_handle_shift_out_of_bounds (); > } > else > { > 0 > }, a << b; > > from original "a <<= b;".
For the "a < 0" here, and signed left shift of a positive value shifting a 1 into or past the sign bit, I think it should be possible to control the checks separately from other checks on shifts - both because those cases were implementation-defined in C90, only undefined in C99/C11, and because they are widely used in practice. > There is of course a lot of stuff that needs to be done, more > specifically: 5) Testcases (or if applicable, running existing testcases coming with the library). 6) Map -ftrapv onto an appropriate subset of this option that handles the cases -ftrapv was meant to handle (so arithmetic overflow, which I'd say should include INT_MIN / -1). > 4) and of course, more instrumentation (C/C++ FE, gimple level) > What comes to mind is: > - float/double to integer conversions, Under Annex F, these return an unspecified value rather than being undefined behavior. > - integer overflows (a long list of various cases here), Strictly, including INT_MIN % -1 (both / and % are undefined if the result of either is unrepresentable) - it appears you've already got that. Of course INT_MIN % -1 and INT_MIN / -1 should *work* reliably with -fwrapv, which is another bug (30484). > - invalid conversions of int to bool, What do you mean? Conversion to bool is just a comparison != 0. > - VLAs size (e.g. negative size), Or the multiplication used to compute the size in bytes overflows (really, there should be some code generated expanding the stack bit by bit to avoid it accidentally overflowing into another allocated area of memory, I suppose). > +@item -fsanitize=undefined > +Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector > +Various computations will be instrumented to detect > +undefined behavior, e.g. division by zero or various overflows. e.g.@: -- Joseph S. Myers jos...@codesourcery.com