On Tue, 12 Mar 2024, Jakub Jelinek wrote:

> Hi!
> 
> This PR is similar to PR110603 fixed with r14-8487, except in a different
> spot.  From the memset with -1 size of non-zero value we determine minimum
> of (size_t) -1 and the code uses PTRDIFF_MAX - 2 (not really sure I
> understand why it is - 2 and not - 1, e.g. heap allocated array
> with PTRDIFF_MAX char elements which contain '\0' in the last element
> should be fine, no?  One can still represent arr[PTRDIFF_MAX] - arr[0]
> and arr[0] - arr[PTRDIFF_MAX] in ptrdiff_t and
> strlen (arr) == PTRDIFF_MAX - 1) as the maximum, so again invalid range.
> As in the other case, it is just UB that can lead to that, and we have
> choice to only keep the min and use +inf for max, or only keep max
> and use 0 for min, or not set the range at all, or use [min, min] or
> [max, max] etc.  The following patch uses [min, +inf].
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2024-03-12  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/114293
>       * tree-ssa-strlen.cc (strlen_pass::handle_builtin_strlen): If
>       max is smaller than min, set max to ~(size_t)0.
> 
>       * gcc.dg/pr114293.c: New test.
> 
> --- gcc/tree-ssa-strlen.cc.jj 2024-01-30 09:57:58.361809262 +0100
> +++ gcc/tree-ssa-strlen.cc    2024-03-11 10:35:04.305650520 +0100
> @@ -2341,6 +2341,8 @@ strlen_pass::handle_builtin_strlen ()
>                 wide_int min = wi::to_wide (old);
>                 wide_int max
>                   = wi::to_wide (TYPE_MAX_VALUE (ptrdiff_type_node)) - 2;
> +               if (wi::gtu_p (min, max))
> +                 max = wi::to_wide (TYPE_MAX_VALUE (TREE_TYPE (lhs)));
>                 set_strlen_range (lhs, min, max);
>               }
>             else
> --- gcc/testsuite/gcc.dg/pr114293.c.jj        2024-03-11 10:41:04.375708877 
> +0100
> +++ gcc/testsuite/gcc.dg/pr114293.c   2024-03-11 10:40:50.355895196 +0100
> @@ -0,0 +1,10 @@
> +/* PR tree-optimization/114293 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -w" } */
> +
> +int
> +foo (int x)
> +{
> +  __builtin_memset (&x, 5, -1);
> +  return __builtin_strlen ((char *) &x);
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to