Fix fallthrough attribute ignorance w/ -fsanitize=address (PR sanitizer/82792).
authorMartin Liska <mliska@suse.cz>
Wed, 8 Nov 2017 08:17:30 +0000 (09:17 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 8 Nov 2017 08:17:30 +0000 (08:17 +0000)
2017-11-08  Martin Liska  <mliska@suse.cz>

PR sanitizer/82792
* gimplify.c (expand_FALLTHROUGH_r): Skip IFN_ASAN_MARK.
2017-11-08  Martin Liska  <mliska@suse.cz>

PR sanitizer/82792
* g++.dg/asan/pr82792.C: New test.

From-SVN: r254519

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/asan/pr82792.C [new file with mode: 0644]

index 2c7cecb0bb17d6ed01216bc1979f3e020fd62f37..b1519aa6a20747f284313affd2d3d594c57a1572 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-08  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/82792
+       * gimplify.c (expand_FALLTHROUGH_r): Skip IFN_ASAN_MARK.
+
 2017-11-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gimple-pretty-print.c (dump_profile): Return "" instead of NULL.
index c4fd5038d922441b27cca50202abe758219fe5e3..9563d825a6aff05682a1717dc371e876f0d39b23 100644 (file)
@@ -2223,7 +2223,8 @@ expand_FALLTHROUGH_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
          while (!gsi_end_p (gsi2))
            {
              stmt = gsi_stmt (gsi2);
-             if (gimple_code (stmt) == GIMPLE_LABEL)
+             enum gimple_code gc = gimple_code (stmt);
+             if (gc == GIMPLE_LABEL)
                {
                  tree label = gimple_label_label (as_a <glabel *> (stmt));
                  if (gimple_has_location (stmt) && DECL_ARTIFICIAL (label))
@@ -2232,8 +2233,11 @@ expand_FALLTHROUGH_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
                      break;
                    }
                }
+             else if (gc == GIMPLE_CALL
+                      && gimple_call_internal_p (stmt, IFN_ASAN_MARK))
+               ;
              else
-               /* Something other than a label.  That's not expected.  */
+               /* Something other is not expected.  */
                break;
              gsi_next (&gsi2);
            }
index ee526bfc949843a586bc4f02aa26e6af0fd62243..b10bf322934a7ad70e4fee6f8b004a97ea23d82e 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-08  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/82792
+       * g++.dg/asan/pr82792.C: New test.
+
 2017-11-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/82855
diff --git a/gcc/testsuite/g++.dg/asan/pr82792.C b/gcc/testsuite/g++.dg/asan/pr82792.C
new file mode 100644 (file)
index 0000000..99f1c35
--- /dev/null
@@ -0,0 +1,32 @@
+/* PR sanitizer/82792 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=address" } */
+
+extern int
+test (int i, int j)
+{
+  long c;
+  (c) = 1;
+  switch (i)
+    {
+    case 1:
+      if (j)
+       {
+         c = 1;
+       }
+      goto default_case;
+    case 2:
+      {
+       if (j)
+         {
+           c = 0;
+         }
+      }
+      __attribute ((fallthrough));
+    default_case:
+    default:
+      c = 0;
+      break;
+    }
+  return 0;
+}