On December 7, 2017 5:55:47 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >On Wed, Dec 06, 2017 at 05:30:53PM +0100, Jakub Jelinek wrote: >> On Wed, Dec 06, 2017 at 09:20:15AM -0700, Martin Sebor wrote: >> > Attached is a patch with the comment updated/simplified. >> > The tests do the job they need to do today so I just removed >> > the useless attribute but otherwise left them unchanged. If >> > you would like to enhance them in some way please feel free. >> >> Ok for trunk, with a minor nit. I'll tweak the tests incrementally >> when it is in. > >So here is the fix for those testcases. > >They didn't test what they meant to test, because they didn't FAIL >without the patch. That is because the bug was that the -W* option >affected code generation, so with -O2 -Wno-stringop-overflow it didn't >trigger it. >I've changed the tests to test both in a separate noipa function where >it doesn't know about the aliasing and string lengths from the caller, >in that case it does more verifications, including the content of the >whole buffer, and the individual values of the lengths, >and what you did before. > >Regtested on x86_64-linux and i686-linux, verified that with the >r255446 tree-ssa-strlen.c change reverted it FAILs. > >Ok for trunk?
OK. Richard. >2017-12-07 Jakub Jelinek <ja...@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. > >--- gcc/testsuite/gcc.dg/tree-ssa/strncpy-2.c.jj 2017-12-06 >20:11:54.000000000 +0100 >+++ gcc/testsuite/gcc.dg/tree-ssa/strncpy-2.c 2017-12-07 >13:31:32.719722416 +0100 >@@ -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; > } >--- gcc/testsuite/gcc.dg/tree-ssa/strncat.c.jj 2017-12-06 >20:11:54.000000000 +0100 >+++ gcc/testsuite/gcc.dg/tree-ssa/strncat.c 2017-12-07 >13:31:09.568008365 +0100 >@@ -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; > } > > > Jakub