PR c/85365 - -Wrestrict false positives with -fsanitize=undefined
authorMartin Sebor <msebor@redhat.com>
Fri, 20 Apr 2018 23:43:51 +0000 (23:43 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Fri, 20 Apr 2018 23:43:51 +0000 (17:43 -0600)
gcc/ChangeLog:

PR c/85365
* gimple-fold.c (gimple_fold_builtin_strcpy): Suppress -Wrestrict
for null pointers.
(gimple_fold_builtin_stxcpy_chk): Same.
* gimple-ssa-warn-restrict.c (check_bounds_or_overlap): Same.

gcc/testsuite/ChangeLog:

PR c/85365
* gcc.dg/Wrestrict-15.c: New test.

From-SVN: r259535

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

index b58362d217472af31b8677291003eca350d14dd1..750958465f9655f947d9b3d15522b4ab867acc06 100644 (file)
@@ -1,3 +1,11 @@
+2018-04-20  Martin Sebor  <msebor@redhat.com>
+
+       PR c/85365
+       * gimple-fold.c (gimple_fold_builtin_strcpy): Suppress -Wrestrict
+       for null pointers.
+       (gimple_fold_builtin_stxcpy_chk): Same.
+       * gimple-ssa-warn-restrict.c (check_bounds_or_overlap): Same.
+
 2018-04-20  Michael Meissner  <meissner@linux.ibm.com>
 
        PR target/85456
index 7771988b83782d0bdcf64d40fe3a68a9678591d5..bd8c44a6a607287eb47fa3bb996765ec546aba14 100644 (file)
@@ -1612,7 +1612,11 @@ gimple_fold_builtin_strcpy (gimple_stmt_iterator *gsi,
   /* If SRC and DEST are the same (and not volatile), return DEST.  */
   if (operand_equal_p (src, dest, 0))
     {
-      if (!gimple_no_warning_p (stmt))
+      /* Issue -Wrestrict unless the pointers are null (those do
+        not point to objects and so do not indicate an overlap;
+        such calls could be the result of sanitization and jump
+        threading).  */
+      if (!integer_zerop (dest) && !gimple_no_warning_p (stmt))
        {
          tree func = gimple_call_fndecl (stmt);
 
@@ -2593,7 +2597,11 @@ gimple_fold_builtin_stxcpy_chk (gimple_stmt_iterator *gsi,
   /* If SRC and DEST are the same (and not volatile), return DEST.  */
   if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
     {
-      if (!gimple_no_warning_p (stmt))
+      /* Issue -Wrestrict unless the pointers are null (those do
+        not point to objects and so do not indicate an overlap;
+        such calls could be the result of sanitization and jump
+        threading).  */
+      if (!integer_zerop (dest) && !gimple_no_warning_p (stmt))
        {
          tree func = gimple_call_fndecl (stmt);
 
index e7a85fdcd13b246f3e9fc035c169fe02bde91c1c..3d0664da028a400cc01b239239e9ccb3e4c23826 100644 (file)
@@ -1880,11 +1880,20 @@ check_bounds_or_overlap (gcall *call, tree dst, tree src, tree dstsize,
 
   if (operand_equal_p (dst, src, 0))
     {
-      warning_at (loc, OPT_Wrestrict,
-                 "%G%qD source argument is the same as destination",
-                 call, func);
-      gimple_set_no_warning (call, true);
-      return false;
+      /* Issue -Wrestrict unless the pointers are null (those do
+        not point to objects and so do not indicate an overlap;
+        such calls could be the result of sanitization and jump
+        threading).  */
+      if (!integer_zerop (dst) && !gimple_no_warning_p (call))
+       {
+         warning_at (loc, OPT_Wrestrict,
+                     "%G%qD source argument is the same as destination",
+                     call, func);
+         gimple_set_no_warning (call, true);
+         return false;
+       }
+
+      return true;
     }
 
   /* Return false when overlap has been detected.  */
index 5314d9e14b4f7a92e81b79ad6e2d2adafc0ff27f..947b974cab1f8707796f21d2fc3ae1df2e0ae99c 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-20  Martin Sebor  <msebor@redhat.com>
+
+       PR c/85365
+       * gcc.dg/Wrestrict-15.c: New test.
+
 2018-04-20  Michael Meissner  <meissner@linux.ibm.com>
 
        PR target/85456
diff --git a/gcc/testsuite/gcc.dg/Wrestrict-15.c b/gcc/testsuite/gcc.dg/Wrestrict-15.c
new file mode 100644 (file)
index 0000000..b0b30a2
--- /dev/null
@@ -0,0 +1,38 @@
+/* PR 85365 - -Wrestrict false positives with -fsanitize=undefined
+   { dg-do compile }
+   { dg-options "-O2 -Wrestrict -fsanitize=undefined" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+char *strcpy (char *, const char *);
+char *strcat (char *, const char *);
+
+size_t strlen (char *);
+
+extern char a[], b[], d[];
+
+size_t t1 (char *g, int i)
+{
+  /* The following exercises the handling in gimple-fold.c.  */
+  strcpy (g + 4, i ? b : a);    /* { dg-bogus "\\\[-Wrestrict]" } */
+  return strlen (g + 4);
+}
+
+void t2 (char *g, int i)
+{
+  strcpy (g + 4, i ? b : a);    /* { dg-bogus "\\\[-Wrestrict]" } */
+  strcat (g + 4, d);
+}
+
+void t3 (char *g, int i)
+{
+  /* The following exercises the handling in gimple-ssa-warn-restrict.c.  */
+  strcat (g + 4, i ? b : a);    /* { dg-bogus "\\\[-Wrestrict]" } */
+  strcat (g + 4, d);
+}
+
+void t4 (char *p, char *q)
+{
+  strcpy (p, q);                /* { dg-bogus "\\\[-Wrestrict]" } */
+  strcat (p, q + 32);
+}