re PR tree-optimization/83075 (Invalid strncpy optimization)
authorJakub Jelinek <jakub@redhat.com>
Thu, 7 Dec 2017 23:55:18 +0000 (00:55 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 7 Dec 2017 23:55:18 +0000 (00:55 +0100)
PR tree-optimization/83075
* gcc.dg/tree-ssa/strncpy-2.c: Use size_t instead of unsigned, add
separate function with noipa attribute to also verify behavior when
optimizers don't know the sizes and aliasing, verify resulting sizes
and array content.  Add -Wstringop-overflow to dg-options.
* gcc.dg/tree-ssa/strncat.c: Likewise.

From-SVN: r255485

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/strncat.c
gcc/testsuite/gcc.dg/tree-ssa/strncpy-2.c

index 9f8e8373aafcbc1981237ff6f55eb3db02e64760..d4cb0d20fdd8f0a966e13c84581fd38828fa94b5 100644 (file)
@@ -1,3 +1,12 @@
+2017-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/83075
+       * gcc.dg/tree-ssa/strncpy-2.c: Use size_t instead of unsigned, add
+       separate function with noipa attribute to also verify behavior when
+       optimizers don't know the sizes and aliasing, verify resulting sizes
+       and array content.  Add -Wstringop-overflow to dg-options.
+       * gcc.dg/tree-ssa/strncat.c: Likewise.
+
 2017-12-07  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * lib/target-supports.exp (check_effective_target_fstack_protector):
index 93a60c8fd1ab4236475eeed9919f63a14f238721..9b8cf238297e8947f35090f013ae6b7c9f56a4d4 100644 (file)
@@ -1,19 +1,35 @@
-/* PR tree-optimization/83075 - Invalid strncpy optimization
-   { dg-do run }
-   { dg-options "-O2 -Wno-stringop-overflow" } */
+/* PR tree-optimization/83075 - Invalid strncpy optimization */
+/* { dg-do run } */
+/* { dg-options "-O2 -Wstringop-overflow" } */
 
-int main (void)
+typedef __SIZE_TYPE__ size_t;
+
+__attribute__((noipa)) size_t
+foo (char *p, char *q, size_t *r)
 {
-  char a[8] = "";
+  size_t n0 = __builtin_strlen (p);
+  __builtin_strncat (q, p, n0);                /* { dg-warning "specified bound depends on the length" } */
+  size_t n1 = __builtin_strlen (p);
+  *r = n0;
+  return n1;
+}
 
+int
+main ()
+{
+  char a[8] = "";
   __builtin_strcpy (a, "123");
-
-  unsigned n0 = __builtin_strlen (a);
-
-  __builtin_strncat (a + 3, a, n0);
-
-  unsigned n1 = __builtin_strlen (a);
-
+  size_t n0 = __builtin_strlen (a);
+  __builtin_strncat (a + 3, a, n0);    /* { dg-warning "specified bound depends on the length" } */
+  size_t n1 = __builtin_strlen (a);
   if (n1 == n0)
     __builtin_abort ();
+  a[6] = '7';
+  __builtin_strcpy (a, "456");
+  size_t n2;
+  if (foo (a, a + 3, &n2) != 6 || n2 != 3)
+    __builtin_abort ();
+  if (__builtin_memcmp (a, "456456\0", sizeof "456456\0"))
+    __builtin_abort ();
+  return 0;
 }
index 42203d5cda813761665360457f119ba9098ef395..2ef9cd61bee7ef5ca2a0c850fe6a47ab031f1a90 100644 (file)
@@ -1,19 +1,35 @@
-/* PR tree-optimization/83075 - Invalid strncpy optimization
-   { dg-do run }
-   { dg-options "-O2 -Wno-stringop-overflow" } */
+/* PR tree-optimization/83075 - Invalid strncpy optimization */
+/* { dg-do run } */
+/* { dg-options "-O2 -Wstringop-overflow" } */
 
-int main (void)
+typedef __SIZE_TYPE__ size_t;
+
+__attribute__((noipa)) size_t
+foo (char *p, char *q, size_t *r)
 {
-  char a[8] = "";
+  size_t n0 = __builtin_strlen (p);
+  __builtin_strncpy (q, p, n0);                /* { dg-warning "specified bound depends on the length" } */
+  size_t n1 = __builtin_strlen (p);
+  *r = n0;
+  return n1;
+}
 
+int
+main ()
+{
+  char a[8] = "";
   __builtin_strcpy (a, "123");
-
-  unsigned n0 = __builtin_strlen (a);
-
-  __builtin_strncpy (a + 3, a, n0);
-
-  unsigned n1 = __builtin_strlen (a);
-
+  size_t n0 = __builtin_strlen (a);
+  __builtin_strncpy (a + 3, a, n0);    /* { dg-warning "specified bound depends on the length" } */
+  size_t n1 = __builtin_strlen (a);
   if (n1 == n0)
     __builtin_abort ();
+  a[6] = '7';
+  __builtin_strcpy (a, "456");
+  size_t n2;
+  if (foo (a, a + 3, &n2) != 7 || n2 != 3)
+    __builtin_abort ();
+  if (__builtin_memcmp (a, "4564567", sizeof "4564567"))
+    __builtin_abort ();
+  return 0;
 }