Message ID | 20161123193354.GU3541@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
On November 23, 2016 8:33:54 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote: >Hi! > >As mentioned in the PR, the r240491 change broke -fsanitize=undefined, >which no longer enables -fsanitize=unreachable or -fsanitize=return. >That is undesirable change, we only want not to enable >-fsanitize-recover=unreachable,return on -fsanitize-recover=undefined. > >Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok >for >trunk? OK. Richard. >2016-11-23 Jakub Jelinek <jakub@redhat.com> > > PR sanitizer/69278 > * opts.c (parse_sanitizer_options): For -fsanitize=undefined, > restore enabling also SANITIZE_UNREACHABLE and SANITIZE_RETURN. > > * g++.dg/ubsan/return-7.C: New test. > * c-c++-common/ubsan/unreachable-4.c: New test. > >--- gcc/opts.c.jj 2016-11-23 16:47:34.000000000 +0100 >+++ gcc/opts.c 2016-11-23 18:25:05.400325912 +0100 >@@ -1558,7 +1558,8 @@ parse_sanitizer_options (const char *p, > /* Do not enable -fsanitize-recover=unreachable and > -fsanitize-recover=return if -fsanitize-recover=undefined > is selected. */ >- if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED) >+ if (code == OPT_fsanitize_recover_ >+ && sanitizer_opts[i].flag == SANITIZE_UNDEFINED) > flags |= (SANITIZE_UNDEFINED > & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN)); > else >--- gcc/testsuite/g++.dg/ubsan/return-7.C.jj 2016-11-23 >18:27:16.525687072 +0100 >+++ gcc/testsuite/g++.dg/ubsan/return-7.C 2016-11-23 18:27:21.854620469 >+0100 >@@ -0,0 +1,27 @@ >+// { dg-do run } >+// { dg-options "-fsanitize=undefined" } >+// { dg-shouldfail "ubsan" } >+ >+struct S { S (); ~S (); }; >+ >+S::S () {} >+S::~S () {} >+ >+int >+foo (int x) >+{ >+ S a; >+ { >+ S b; >+ if (x) >+ return 1; >+ } >+} >+ >+int >+main () >+{ >+ foo (0); >+} >+ >+// { dg-output "execution reached the end of a value-returning >function without returning a value" } >--- gcc/testsuite/c-c++-common/ubsan/unreachable-4.c.jj 2016-11-23 >18:25:57.692672348 +0100 >+++ gcc/testsuite/c-c++-common/ubsan/unreachable-4.c 2016-11-23 >18:26:05.961569001 +0100 >@@ -0,0 +1,10 @@ >+/* { dg-do run } */ >+/* { dg-options "-fsanitize=undefined" } */ >+/* { dg-shouldfail "ubsan" } */ >+ >+int >+main (void) >+{ >+ __builtin_unreachable (); >+} >+ /* { dg-output "execution reached a __builtin_unreachable\\(\\) call" >} */ > > Jakub
--- gcc/opts.c.jj 2016-11-23 16:47:34.000000000 +0100 +++ gcc/opts.c 2016-11-23 18:25:05.400325912 +0100 @@ -1558,7 +1558,8 @@ parse_sanitizer_options (const char *p, /* Do not enable -fsanitize-recover=unreachable and -fsanitize-recover=return if -fsanitize-recover=undefined is selected. */ - if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED) + if (code == OPT_fsanitize_recover_ + && sanitizer_opts[i].flag == SANITIZE_UNDEFINED) flags |= (SANITIZE_UNDEFINED & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN)); else --- gcc/testsuite/g++.dg/ubsan/return-7.C.jj 2016-11-23 18:27:16.525687072 +0100 +++ gcc/testsuite/g++.dg/ubsan/return-7.C 2016-11-23 18:27:21.854620469 +0100 @@ -0,0 +1,27 @@ +// { dg-do run } +// { dg-options "-fsanitize=undefined" } +// { dg-shouldfail "ubsan" } + +struct S { S (); ~S (); }; + +S::S () {} +S::~S () {} + +int +foo (int x) +{ + S a; + { + S b; + if (x) + return 1; + } +} + +int +main () +{ + foo (0); +} + +// { dg-output "execution reached the end of a value-returning function without returning a value" } --- gcc/testsuite/c-c++-common/ubsan/unreachable-4.c.jj 2016-11-23 18:25:57.692672348 +0100 +++ gcc/testsuite/c-c++-common/ubsan/unreachable-4.c 2016-11-23 18:26:05.961569001 +0100 @@ -0,0 +1,10 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=undefined" } */ +/* { dg-shouldfail "ubsan" } */ + +int +main (void) +{ + __builtin_unreachable (); +} + /* { dg-output "execution reached a __builtin_unreachable\\(\\) call" } */