re PR sanitizer/69278 (Confusion option handling for -sanitize-recovery=alll)
authorJakub Jelinek <jakub@redhat.com>
Wed, 23 Nov 2016 19:51:27 +0000 (20:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 23 Nov 2016 19:51:27 +0000 (20:51 +0100)
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.

From-SVN: r242795

gcc/ChangeLog
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/ubsan/unreachable-4.c [new file with mode: 0644]
gcc/testsuite/g++.dg/ubsan/return-7.C [new file with mode: 0644]

index c610804b3b8f962b8ea67b6d5afe9bddc693519f..276d8b8f57fe9eb6b2ba24975395108d0b9802a9 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2016-11-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/69183
index cb20154d1949e9ee249253327a3e4cd49d1ef2ac..c61c3677a668cc68a7befc740290f7d444a560e5 100644 (file)
@@ -1558,7 +1558,8 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
                /* 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
index 317b4d101c96a8dddbd9039950d9e0e896b4ea40..b8cb594840a0ac5c7e555a554ee068f04e1cab2e 100644 (file)
@@ -1,5 +1,9 @@
 2016-11-23  Jakub Jelinek  <jakub@redhat.com>
 
+       PR sanitizer/69278
+       * g++.dg/ubsan/return-7.C: New test.
+       * c-c++-common/ubsan/unreachable-4.c: New test.
+
        PR tree-optimization/78482
        * gcc.dg/torture/pr78482.c (c, d): Use signed char instead of char.
        (bar): New function.
diff --git a/gcc/testsuite/c-c++-common/ubsan/unreachable-4.c b/gcc/testsuite/c-c++-common/ubsan/unreachable-4.c
new file mode 100644 (file)
index 0000000..71b56e3
--- /dev/null
@@ -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" } */
diff --git a/gcc/testsuite/g++.dg/ubsan/return-7.C b/gcc/testsuite/g++.dg/ubsan/return-7.C
new file mode 100644 (file)
index 0000000..316cb4b
--- /dev/null
@@ -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" }