re PR sanitizer/83014 (ICE in pretty-print with -fsanitize=bounds)
authorJakub Jelinek <jakub@redhat.com>
Fri, 24 Nov 2017 08:35:10 +0000 (09:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 24 Nov 2017 08:35:10 +0000 (09:35 +0100)
PR sanitizer/83014
* ubsan.c (ubsan_type_descriptor): Use pp_unsigned_wide_integer
instead of pp_printf with HOST_WIDE_INT_PRINT_DEC.  Avoid calling
tree_to_uhwi twice.

* gcc.dg/ubsan/pr83014.c: New test.

From-SVN: r255134

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ubsan/pr83014.c [new file with mode: 0644]
gcc/ubsan.c

index 787e545949e0789a38d8d6e417d591efc752ae5b..8f34f37b3652206666288f121eb91c644ca770ee 100644 (file)
@@ -1,5 +1,10 @@
 2017-11-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR sanitizer/83014
+       * ubsan.c (ubsan_type_descriptor): Use pp_unsigned_wide_integer
+       instead of pp_printf with HOST_WIDE_INT_PRINT_DEC.  Avoid calling
+       tree_to_uhwi twice.
+
        * tree-object-size.c (pass_through_call): Use gimple_call_return_flags
        ERF_RETURN*ARG* for builtins other than BUILT_IN_ASSUME_ALIGNED,
        check for the latter with gimple_call_builtin_p.  Do not handle
index 480a5c637ff7ba27825bb200831dc188ee54c67a..eef79af85a494d397eea242b70981aa65b8b34c3 100644 (file)
@@ -1,5 +1,8 @@
 2017-11-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR sanitizer/83014
+       * gcc.dg/ubsan/pr83014.c: New test.
+
        * gcc.dg/builtin-object-size-18.c: New test.
 
 2017-11-23  Julia Koval  <julia.koval@intel.com>
diff --git a/gcc/testsuite/gcc.dg/ubsan/pr83014.c b/gcc/testsuite/gcc.dg/ubsan/pr83014.c
new file mode 100644 (file)
index 0000000..de62604
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR sanitizer/83014 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined" } */
+
+int
+foo (void)
+{
+  int data[5];
+  data[0] = 0;
+  data[5] = 0;
+  return data[0];
+}
index 560d4654850b77aada55df9dbc7b2dab24938302..efde3f7bc365d6dcaa1e79b5f156e1499328c060 100644 (file)
@@ -436,10 +436,10 @@ ubsan_type_descriptor (tree type, enum ubsan_print_style pstyle)
              && TYPE_MAX_VALUE (dom) != NULL_TREE
              && TREE_CODE (TYPE_MAX_VALUE (dom)) == INTEGER_CST)
            {
+             unsigned HOST_WIDE_INT m;
              if (tree_fits_uhwi_p (TYPE_MAX_VALUE (dom))
-                 && tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1 != 0)
-               pp_printf (&pretty_name, HOST_WIDE_INT_PRINT_DEC,
-                           tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1);
+                 && (m = tree_to_uhwi (TYPE_MAX_VALUE (dom))) + 1 != 0)
+               pp_unsigned_wide_integer (&pretty_name, m + 1);
              else
                pp_wide_int (&pretty_name,
                             wi::add (wi::to_widest (TYPE_MAX_VALUE (dom)), 1),