gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use offset_int::from...
authorMartin Sebor <msebor@redhat.com>
Wed, 3 Jan 2018 20:38:30 +0000 (20:38 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 3 Jan 2018 20:38:30 +0000 (13:38 -0700)
gcc/ChangeLog:

* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use
offset_int::from instead of wide_int::to_shwi.
(maybe_diag_overlap): Remove assertion.
Use HOST_WIDE_INT_PRINT_DEC instead of %lli.
* gimple-ssa-sprintf.c (format_directive): Same.
(parse_directive): Same.
(sprintf_dom_walker::compute_format_length): Same.
(try_substitute_return_value): Same.

gcc/testsuite/ChangeLog:

* gcc.dg/Wrestrict-3.c: New test.

From-SVN: r256187

gcc/ChangeLog
gcc/gimple-ssa-sprintf.c
gcc/gimple-ssa-warn-restrict.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wrestrict-3.c [new file with mode: 0644]

index f570eb4e606ae3300b49cf621a1bca6ce0fec351..10e8d9ee513588cc3720bc61b73a43295a0d16e9 100644 (file)
@@ -1,3 +1,14 @@
+2018-01-03  Martin Sebor  <msebor@redhat.com>
+
+       * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use
+       offset_int::from instead of wide_int::to_shwi.
+       (maybe_diag_overlap): Remove assertion.
+       Use HOST_WIDE_INT_PRINT_DEC instead of %lli.
+       * gimple-ssa-sprintf.c (format_directive): Same.
+       (parse_directive): Same.
+       (sprintf_dom_walker::compute_format_length): Same.
+       (try_substitute_return_value): Same.
+
 2017-01-03  Jeff Law  <law@redhat.com>
 
        PR middle-end/83654
index b7d7cd55f7a28455bd4764933315937bec675397..7d16bbd16f87e22298f4a82da58f08c86d2d966e 100644 (file)
@@ -2995,16 +2995,16 @@ format_directive (const sprintf_dom_walker::call_info &info,
 
   if (dump_file && *dir.beg)
     {
-      fprintf (dump_file, "    Result: %lli, %lli, %lli, %lli "
-              "(%lli, %lli, %lli, %lli)\n",
-              (long long)fmtres.range.min,
-              (long long)fmtres.range.likely,
-              (long long)fmtres.range.max,
-              (long long)fmtres.range.unlikely,
-              (long long)res->range.min,
-              (long long)res->range.likely,
-              (long long)res->range.max,
-              (long long)res->range.unlikely);
+      fprintf (dump_file,
+              "    Result: "
+              HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ", "
+              HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC " ("
+              HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ", "
+              HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ")\n",
+              fmtres.range.min, fmtres.range.likely,
+              fmtres.range.max, fmtres.range.unlikely,
+              res->range.min, res->range.likely,
+              res->range.max, res->range.unlikely);
     }
 
   return true;
@@ -3035,11 +3035,12 @@ parse_directive (sprintf_dom_walker::call_info &info,
 
       if (dump_file)
        {
-         fprintf (dump_file, "  Directive %u at offset %llu: \"%.*s\", "
-                  "length = %llu\n",
+         fprintf (dump_file, "  Directive %u at offset "
+                  HOST_WIDE_INT_PRINT_UNSIGNED ": \"%.*s\", "
+                  "length = " HOST_WIDE_INT_PRINT_UNSIGNED "\n",
                   dir.dirno,
-                  (unsigned long long)(size_t)(dir.beg - info.fmtstr),
-                  (int)dir.len, dir.beg, (unsigned long long)dir.len);
+                  (unsigned HOST_WIDE_INT)(size_t)(dir.beg - info.fmtstr),
+                  (int)dir.len, dir.beg, dir.len);
        }
 
       return len - !*str;
@@ -3411,25 +3412,34 @@ parse_directive (sprintf_dom_walker::call_info &info,
 
   if (dump_file)
     {
-      fprintf (dump_file, "  Directive %u at offset %llu: \"%.*s\"",
-              dir.dirno, (unsigned long long)(size_t)(dir.beg - info.fmtstr),
+      fprintf (dump_file,
+              "  Directive %u at offset " HOST_WIDE_INT_PRINT_UNSIGNED
+              ": \"%.*s\"",
+              dir.dirno,
+              (unsigned HOST_WIDE_INT)(size_t)(dir.beg - info.fmtstr),
               (int)dir.len, dir.beg);
       if (star_width)
        {
          if (dir.width[0] == dir.width[1])
-           fprintf (dump_file, ", width = %lli", (long long)dir.width[0]);
+           fprintf (dump_file, ", width = " HOST_WIDE_INT_PRINT_DEC,
+                    dir.width[0]);
          else
-           fprintf (dump_file, ", width in range [%lli, %lli]",
-                    (long long)dir.width[0], (long long)dir.width[1]);
+           fprintf (dump_file,
+                    ", width in range [" HOST_WIDE_INT_PRINT_DEC
+                    ", " HOST_WIDE_INT_PRINT_DEC "]",
+                    dir.width[0], dir.width[1]);
        }
 
       if (star_precision)
        {
          if (dir.prec[0] == dir.prec[1])
-           fprintf (dump_file, ", precision = %lli", (long long)dir.prec[0]);
+           fprintf (dump_file, ", precision = " HOST_WIDE_INT_PRINT_DEC,
+                    dir.prec[0]);
          else
-           fprintf (dump_file, ", precision in range [%lli, %lli]",
-                    (long long)dir.prec[0], (long long)dir.prec[1]);
+           fprintf (dump_file,
+                    ", precision in range [" HOST_WIDE_INT_PRINT_DEC
+                    HOST_WIDE_INT_PRINT_DEC "]",
+                    dir.prec[0], dir.prec[1]);
        }
       fputc ('\n', dump_file);
     }
@@ -3455,8 +3465,10 @@ sprintf_dom_walker::compute_format_length (call_info &info,
               LOCATION_FILE (callloc), LOCATION_LINE (callloc));
       print_generic_expr (dump_file, info.func, dump_flags);
 
-      fprintf (dump_file, ": objsize = %llu, fmtstr = \"%s\"\n",
-              (unsigned long long)info.objsize, info.fmtstr);
+      fprintf (dump_file,
+              ": objsize = " HOST_WIDE_INT_PRINT_UNSIGNED
+              ", fmtstr = \"%s\"\n",
+              info.objsize, info.fmtstr);
     }
 
   /* Reset the minimum and maximum byte counters.  */
@@ -3682,13 +3694,14 @@ try_substitute_return_value (gimple_stmt_iterator *gsi,
          const char *what = setrange ? "Setting" : "Discarding";
          if (retval[0] != retval[1])
            fprintf (dump_file,
-                    "  %s %s-bounds return value range [%llu, %llu].\n",
-                    what, inbounds,
-                    (unsigned long long)retval[0],
-                    (unsigned long long)retval[1]);
+                    "  %s %s-bounds return value range ["
+                    HOST_WIDE_INT_PRINT_UNSIGNED ", "
+                    HOST_WIDE_INT_PRINT_UNSIGNED "].\n",
+                    what, inbounds, retval[0], retval[1]);
          else
-           fprintf (dump_file, "  %s %s-bounds return value %llu.\n",
-                    what, inbounds, (unsigned long long)retval[0]);
+           fprintf (dump_file, "  %s %s-bounds return value "
+                    HOST_WIDE_INT_PRINT_UNSIGNED ".\n",
+                    what, inbounds, retval[0]);
        }
     }
 
index 9b367979c8be1d716f6c248499642716524b57cb..8bae73dd42b63785d60faa3796e7e9135f8f67a1 100644 (file)
@@ -276,13 +276,13 @@ builtin_memref::builtin_memref (tree expr, tree size)
                  value_range_type rng = get_range_info (offset, &min, &max);
                  if (rng == VR_RANGE)
                    {
-                     offrange[0] = min.to_shwi ();
-                     offrange[1] = max.to_shwi ();
+                     offrange[0] = offset_int::from (min, SIGNED);
+                     offrange[1] = offset_int::from (max, SIGNED);
                    }
                  else if (rng == VR_ANTI_RANGE)
                    {
-                     offrange[0] = (max + 1).to_shwi ();
-                     offrange[1] = (min - 1).to_shwi ();
+                     offrange[0] = offset_int::from (max + 1, SIGNED);
+                     offrange[1] = offset_int::from (min - 1, SIGNED);
                    }
                  else
                    {
@@ -1233,25 +1233,31 @@ maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
 
   if (dstref.offrange[0] == dstref.offrange[1]
       || dstref.offrange[1] > HOST_WIDE_INT_MAX)
-    sprintf (offstr[0], "%lli", (long long) dstref.offrange[0].to_shwi ());
+    sprintf (offstr[0], HOST_WIDE_INT_PRINT_DEC,
+            dstref.offrange[0].to_shwi ());
   else
-    sprintf (offstr[0], "[%lli, %lli]",
-            (long long) dstref.offrange[0].to_shwi (),
-            (long long) dstref.offrange[1].to_shwi ());
+    sprintf (offstr[0],
+            "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+            dstref.offrange[0].to_shwi (),
+            dstref.offrange[1].to_shwi ());
 
   if (srcref.offrange[0] == srcref.offrange[1]
       || srcref.offrange[1] > HOST_WIDE_INT_MAX)
-    sprintf (offstr[1], "%lli", (long long) srcref.offrange[0].to_shwi ());
+    sprintf (offstr[1],
+            HOST_WIDE_INT_PRINT_DEC,
+            srcref.offrange[0].to_shwi ());
   else
-    sprintf (offstr[1], "[%lli, %lli]",
-            (long long) srcref.offrange[0].to_shwi (),
-            (long long) srcref.offrange[1].to_shwi ());
+    sprintf (offstr[1],
+            "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+            srcref.offrange[0].to_shwi (),
+            srcref.offrange[1].to_shwi ());
 
   if (ovloff[0] == ovloff[1] || !ovloff[1])
-    sprintf (offstr[2], "%lli", (long long) ovloff[0]);
+    sprintf (offstr[2], HOST_WIDE_INT_PRINT_DEC, ovloff[0]);
   else
-    sprintf (offstr[2], "[%lli, %lli]",
-            (long long) ovloff[0], (long long) ovloff[1]);
+    sprintf (offstr[2],
+            "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+            ovloff[0], ovloff[1]);
 
   const offset_int maxobjsize = tree_to_shwi (max_object_size ());
   bool must_overlap = ovlsiz[0] > 0;
@@ -1366,9 +1372,6 @@ maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
     }
 
   /* Issue "may overlap" diagnostics below.  */
-  gcc_assert (ovlsiz[0] == 0
-             && ovlsiz[1] > 0
-             && ovlsiz[1] <= maxobjsize.to_shwi ());
 
   /* Use more concise wording when one of the offsets is unbounded
      to avoid confusing the user with large and mostly meaningless
index 7c4e6e9a3495631751b248074e5dc5984d0119df..55ed428cae77df2e00b64a493a0ec7790024d955 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-03  Martin Sebor  <msebor@redhat.com>
+
+       * gcc.dg/Wrestrict-3.c: New test.
+
 2018-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/83555
diff --git a/gcc/testsuite/gcc.dg/Wrestrict-3.c b/gcc/testsuite/gcc.dg/Wrestrict-3.c
new file mode 100644 (file)
index 0000000..1204111
--- /dev/null
@@ -0,0 +1,17 @@
+/* Test to verify that the call below with the out-of-bounds offset
+   doesn't trigger an internal assertion and is diagnosed.
+   { dg-do compile }
+   { dg-options "-O2 -Wrestrict" } */
+
+#define DIFF_MAX   __PTRDIFF_MAX__
+
+void test_no_ice (int *d, __PTRDIFF_TYPE__ i, __SIZE_TYPE__ n)
+{
+  if (i < DIFF_MAX / sizeof *d - 1 || DIFF_MAX / sizeof *d + 2 < i)
+    i = DIFF_MAX / sizeof *d - 1;
+
+  if (n < DIFF_MAX)
+    n = DIFF_MAX / sizeof *d;
+
+  __builtin_strncpy ((char*)(d + i), (char*)d, n);   /* { dg-warning "\\\[-Wrestrict]" } */
+}