This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix ubsan EH updating (PR c/71512)


On August 12, 2016 5:58:06 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>With -ftrapv -fnon-call-exceptions -fexceptions +/-/* arithmetics can
>have
>EH edges, and ubsan code didn't take it into account.
>Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok
>for
>trunk/6.2?

OK.

Richard.

>2016-08-12  Jakub Jelinek  <jakub@redhat.com>
>
>	PR c/71512
>	* ubsan.c (instrument_si_overflow): Pass true instead of false
>	to gsi_replace.
>	(pass_ubsan::execute): Call gimple_purge_dead_eh_edges at the end
>	of bbs.  Return TODO_cleanup_cfg if any returned true.
>
>	* g++.dg/ubsan/pr71512.C: New test.
>	* c-c++-common/ubsan/pr71512-1.c: New test.
>	* c-c++-common/ubsan/pr71512-2.c: New test.
>
>--- gcc/ubsan.c.jj	2016-07-19 18:44:25.000000000 +0200
>+++ gcc/ubsan.c	2016-08-12 14:13:02.965390346 +0200
>@@ -1292,7 +1292,7 @@ instrument_si_overflow (gimple_stmt_iter
> 				      ? IFN_UBSAN_CHECK_SUB
> 				      : IFN_UBSAN_CHECK_MUL, 2, a, b);
>       gimple_call_set_lhs (g, lhs);
>-      gsi_replace (&gsi, g, false);
>+      gsi_replace (&gsi, g, true);
>       break;
>     case NEGATE_EXPR:
>       /* Represent i = -u;
>@@ -1302,7 +1302,7 @@ instrument_si_overflow (gimple_stmt_iter
>       b = gimple_assign_rhs1 (stmt);
>       g = gimple_build_call_internal (IFN_UBSAN_CHECK_SUB, 2, a, b);
>       gimple_call_set_lhs (g, lhs);
>-      gsi_replace (&gsi, g, false);
>+      gsi_replace (&gsi, g, true);
>       break;
>     case ABS_EXPR:
>       /* Transform i = ABS_EXPR<u>;
>@@ -1955,6 +1955,7 @@ pass_ubsan::execute (function *fun)
> {
>   basic_block bb;
>   gimple_stmt_iterator gsi;
>+  unsigned int ret = 0;
> 
>   initialize_sanitizer_builtins ();
> 
>@@ -2013,8 +2014,10 @@ pass_ubsan::execute (function *fun)
> 
> 	  gsi_next (&gsi);
> 	}
>+      if (gimple_purge_dead_eh_edges (bb))
>+	ret = TODO_cleanup_cfg;
>     }
>-  return 0;
>+  return ret;
> }
> 
> } // anon namespace
>--- gcc/testsuite/g++.dg/ubsan/pr71512.C.jj	2016-08-12
>14:20:55.547288099 +0200
>+++ gcc/testsuite/g++.dg/ubsan/pr71512.C	2016-08-12 14:20:07.000000000
>+0200
>@@ -0,0 +1,20 @@
>+/* PR c/71512 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -ftrapv -fnon-call-exceptions
>-fsanitize=undefined" } */
>+
>+bool
>+foo (int *x, int *y, int *z)
>+{
>+  try
>+    {
>+      x[0] = y[0] + z[0];
>+      x[1] = y[1] - z[1];
>+      x[2] = y[2] * z[2];
>+      x[3] = -y[3];
>+    }
>+  catch (...)
>+    {
>+      return true;
>+    }
>+  return false;
>+}
>--- gcc/testsuite/c-c++-common/ubsan/pr71512-1.c.jj	2016-08-12
>14:22:49.729807245 +0200
>+++ gcc/testsuite/c-c++-common/ubsan/pr71512-1.c	2016-08-12
>14:22:40.423927934 +0200
>@@ -0,0 +1,5 @@
>+/* PR c/71512 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fnon-call-exceptions -ftrapv -fexceptions
>-fsanitize=undefined" } */
>+
>+#include "../../gcc.dg/pr44545.c"
>--- gcc/testsuite/c-c++-common/ubsan/pr71512-2.c.jj	2016-08-12
>14:22:49.000000000 +0200
>+++ gcc/testsuite/c-c++-common/ubsan/pr71512-2.c	2016-08-12
>14:23:30.541277953 +0200
>@@ -0,0 +1,5 @@
>+/* PR c/71512 */
>+/* { dg-do compile } */
>+/* { dg-options "-O -fexceptions -fnon-call-exceptions -ftrapv
>-fsanitize=undefined" } */
>+
>+#include "../../gcc.dg/pr47086.c"
>
>	Jakub



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]