re PR tree-optimization/86614 (duplicate -Warray-bounds for a strncpy call with...
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Nov 2018 09:12:16 +0000 (10:12 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 23 Nov 2018 09:12:16 +0000 (10:12 +0100)
PR tree-optimization/86614
* gimple-ssa-warn-restrict.c (maybe_diag_offset_bounds): Return early
if TREE_NO_WARNING is set on ref.ref.

* c-c++-common/Warray-bounds-2.c (wrap_strncpy_dstarray_diff_neg,
call_strncpy_dstarray_diff_neg): Don't expect late -Warray-bounds
warnings, just early ones from FE.  Remove dg-prune-output.
* c-c++-common/Warray-bounds-6.c: New test.

From-SVN: r266403

gcc/ChangeLog
gcc/gimple-ssa-warn-restrict.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Warray-bounds-2.c
gcc/testsuite/c-c++-common/Warray-bounds-6.c [new file with mode: 0644]

index 508682f..29ac649 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/86614
+       * gimple-ssa-warn-restrict.c (maybe_diag_offset_bounds): Return early
+       if TREE_NO_WARNING is set on ref.ref.
+
 2018-11-22  Sandra Loosemore  <sandra@codesourcery.com>
            Alan Coopersmith  <alan.coopersmith@oracle.com>
 
index e3cbf42..035fbf8 100644 (file)
@@ -1582,6 +1582,9 @@ maybe_diag_offset_bounds (location_t loc, gimple *call, tree func, int strict,
   if (!warn_array_bounds)
     return false;
 
+  if (ref.ref && TREE_NO_WARNING (ref.ref))
+    return false;
+
   offset_int ooboff[] = { ref.offrange[0], ref.offrange[1] };
   tree oobref = ref.offset_out_of_bounds (strict, ooboff);
   if (!oobref)
index 47cba2d..355221c 100644 (file)
@@ -1,5 +1,11 @@
 2018-11-23  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/86614
+       * c-c++-common/Warray-bounds-2.c (wrap_strncpy_dstarray_diff_neg,
+       call_strncpy_dstarray_diff_neg): Don't expect late -Warray-bounds
+       warnings, just early ones from FE.  Remove dg-prune-output.
+       * c-c++-common/Warray-bounds-6.c: New test.
+
        * gfortran.dg/pad_source_1.f: New test.
        * gfortran.dg/pad_source_2.f: New test.
        * gfortran.dg/pad_source_3.f: New test.
index da5f64d..aee3561 100644 (file)
@@ -201,18 +201,16 @@ void call_strncpy_dst_diff_max (const char *s, size_t n)
 static void
 wrap_strncpy_dstarray_diff_neg (char *d, const char *s, ptrdiff_t i, size_t n)
 {
-  strncpy (d + i, s, n);   /* { dg-warning "offset -\[0-9\]+ is out of the bounds \\\[0, 90] of object .ar10. with type .(struct )?Array ?\\\[2]." "strncpy" } */
-}
+  strncpy (d + i, s, n);   /* { dg-bogus "offset -\[0-9\]+ is out of the bounds \\\[0, 90] of object .ar10. with type .(struct )?Array ?\\\[2]." "strncpy" } */
+}                         /* { dg-warning "array subscript -1 is outside array bounds" "" { target *-*-* } .-1 } */
 
 void call_strncpy_dstarray_diff_neg (const char *s, size_t n)
 {
-  struct Array ar10[2];    /* { dg-message ".ar10. declared here" } */
-  sink (&ar10);
+  struct Array ar10[2];    /* { dg-bogus ".ar10. declared here" } */
+  sink (&ar10);                   /* { dg-message "while referencing" "" { target *-*-* } .-1 } */
 
   int off = (char*)ar10[1].a17 - (char*)ar10 + 1;
   wrap_strncpy_dstarray_diff_neg (ar10[1].a17, s, -off, n);
 
   sink (&ar10);
 }
-
-/* { dg-prune-output "outside array bounds" } */
diff --git a/gcc/testsuite/c-c++-common/Warray-bounds-6.c b/gcc/testsuite/c-c++-common/Warray-bounds-6.c
new file mode 100644 (file)
index 0000000..6611d5c
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/86614 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Warray-bounds" } */
+
+extern char *strncpy (char *, const char *, __SIZE_TYPE__);
+
+void sink (void *);
+
+struct A { char b[17]; } a[2];
+
+void g (const char *s, unsigned n)
+{
+  int i = (char *)a[1].b - (char *)a + 1;
+  char *d = a[1].b;
+  /* Ensure the same bug is not diagnosed more than once.  */
+  strncpy (d + i, s, n);       /* { dg-warning "array subscript \[0-9]+ is outside array bounds of" } */
+                               /* { dg-bogus "offset \[0-9]+ is out of the bounds \\\[0, \[0-9]+\\\] of object 'a' with type" "" { target *-*-* } .-1 } */
+}