https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81292

rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rsandifo at gcc dot 
gnu.org

--- Comment #5 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
(In reply to Jakub Jelinek from comment #4)
> The problem is that we hit:
>       if (si != NULL)
>         {
>           if (!si->full_string_p && !si->stmt)
>             {
>               /* Until now we only had a lower bound on the string length.
>                  Install LHS as the actual length.  */
>               si = unshare_strinfo (si);
>               si->nonzero_chars = lhs;
>               si->full_string_p = true;
>             }
>           return;
>         }
> in handle_builtin_strlen, which changes just that single strinfo record, but
> doesn't do anything for the related ones.  And as strlen doesn't have a vdef
> (it is a pure function), nothing is invalidated, so we end up with a mixture
> of related strinfos where some strinfos are full_string_p and others are
> not,

Bah, sorry, I hadn't considered the lack of a vdef here.

> and e.g. zero_length_string has asserts that this does not happen.
> So, either handle_builtin_strlen needs to adjust also the related strinfos
> if any (note, maybe even if verify_related_strinfos fails we might need to
> do that or invalidate them manually), or we need to invalidate them, or not
> to record this change if we can't adjust or invalidate them all.

Ack.  Will fix.

Reply via email to