On Thu, Jul 25, 2013 at 10:40:22PM +0000, Joseph S. Myers wrote:
> What happens if you bootstrap with this enabled - do whatever failures 
> appear look like genuine bugs?  Running the testsuite with a compiler 
> built with this option?  Running the testsuite with this option used when 
> compiling all these tests.  I guess that initially a bootstrap with this 
> option may fail because of existing bugs, and so the other tests mentioned 
> can't yet be run - but using this option on GCC itself, and making sure 
> that as far as possible it doesn't break compiling things or change 
> diagnostics generated at compile time, seem like good goals.

The bootstrap with -fsanitize=undefined currently fails.  One issue is
http://gcc.gnu.org/ml/gcc-patches/2013-07/msg01480.html
(-Wuninitialized needs fixing I'm afraid), and another is e.g.:

  switch (i)
    {
      case 0 * (1 / 0):
        ;
    }

In the above, in C, we always fail (check_case_value issues 
"error: case label does not reduce to an integer constant").  But in C++,
with -fsanitize=undefined, we get
error: ‘__builtin___ubsan_handle_divrem_overflow((& *.Lubsan_data0), 1u, 0u)’
is not a constant expression
and without sanitizing, there's no error (of course the behavior
is undefined).  I'm not sure how to deal with this, clang in both C/C++ says
error: expression is not an integral constant expression
It seems that this should be handled in semantics.c:verify_constant,
but the function gets <integer_cst ... constant 0> as a tree parameter...

Other than that, currently no other issues leap to mind; I ran 
gcc.dg/*const-expr* tests with -fsanitize=undefined and everything's fine,
gcc.dg/overflow-warn* has some failures, all due to "case 0 * (1 / 0)" issue.

Thanks,

        Marek

Reply via email to