summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-11 15:46:56 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-11 15:46:56 +0000
commit76fe5eed9b5ca4a0c6d93ad3875aba429c56ab80 (patch)
tree7b3ea711beca4099e21f3a5b13f5ec3220c2423c
parent9c6282620dc4a48a3c99665bfeae5f6a99f7d3cd (diff)
downloadgcc-76fe5eed9b5ca4a0c6d93ad3875aba429c56ab80.tar.gz
PR sanitizer/66908
* c-ubsan.c: Include gimplify.h. (ubsan_instrument_division): Unshare OP0 and OP1. (ubsan_instrument_shift): Likewise. * c-c++-common/ubsan/pr66908.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@226782 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c-family/ChangeLog10
-rw-r--r--gcc/c-family/c-ubsan.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/pr66908.c15
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 920783a380c..a1ad8a99bd4 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,13 @@
+2015-08-11 Marek Polacek <polacek@redhat.com>
+
+ Backported from mainline
+ 2015-08-03 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/66908
+ * c-ubsan.c: Include gimplify.h.
+ (ubsan_instrument_division): Unshare OP0 and OP1.
+ (ubsan_instrument_shift): Likewise.
+
2015-07-16 Release Manager
* GCC 5.2.0 released.
diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c
index a14426f9624..1046267196e 100644
--- a/gcc/c-family/c-ubsan.c
+++ b/gcc/c-family/c-ubsan.c
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see
#include "internal-fn.h"
#include "stor-layout.h"
#include "builtins.h"
+#include "gimplify.h"
/* Instrument division by zero and INT_MIN / -1. If not instrumenting,
return NULL_TREE. */
@@ -71,6 +72,9 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
== TYPE_MAIN_VARIANT (TREE_TYPE (op1)));
+ op0 = unshare_expr (op0);
+ op1 = unshare_expr (op1);
+
if (TREE_CODE (type) == INTEGER_TYPE
&& (flag_sanitize & SANITIZE_DIVIDE))
t = fold_build2 (EQ_EXPR, boolean_type_node,
@@ -151,6 +155,9 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
HOST_WIDE_INT op0_prec = TYPE_PRECISION (type0);
tree uprecm1 = build_int_cst (op1_utype, op0_prec - 1);
+ op0 = unshare_expr (op0);
+ op1 = unshare_expr (op1);
+
t = fold_convert_loc (loc, op1_utype, op1);
t = fold_build2 (GT_EXPR, boolean_type_node, t, uprecm1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d862db0b6cf..430c1deaf79 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2015-08-11 Marek Polacek <polacek@redhat.com>
+
+ Backported from mainline
+ 2015-08-03 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/66908
+ * c-c++-common/ubsan/pr66908.c: New test.
+
2015-08-07 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/66929
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr66908.c b/gcc/testsuite/c-c++-common/ubsan/pr66908.c
new file mode 100644
index 00000000000..5f731f0cbae
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/pr66908.c
@@ -0,0 +1,15 @@
+/* PR sanitizer/66908 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=shift,bounds -O2 -Werror=maybe-uninitialized" } */
+/* { dg-additional-options "-std=gnu90" { target c } } */
+
+struct S { int a[22]; };
+static int const e[22] = { };
+
+void
+foo (struct S const *s, unsigned int m, unsigned int *res)
+{
+ unsigned int i;
+ for (i = 0; i < 22; ++i)
+ res[i] = ((s->a[i] + e[i]) << m);
+}