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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org
             Status|WAITING                     |NEW

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I can reproduce it.
The bug is obvious.  We have exp STRING_CST "", nchars is 1, offset is 0 and
nbytes is 4 (because of the UB in the source code).

4812      const char *prep = NULL;
4813      if (TREE_CODE (exp) == STRING_CST)
4814        {
4815          unsigned nchars = TREE_STRING_LENGTH (exp);
4816          if (nchars < offset)
4817            return false;
4818    
4819          if (!nbytes)
4820            /* If NBYTES hasn't been determined earlier, either from
ADDR_EXPR
4821               (i.e., it's the size of a pointer), or from MEM_REF (as the
size
4822               of the access), set it here to the size of the string,
including
4823               all internal and trailing nuls if the string has any.  */
4824            nbytes = nchars - offset;
4825    
4826          prep = TREE_STRING_POINTER (exp) + offset;
4827        }
...
4887              /* When either ALLNUL is set and N is zero, also determine
4888                 whether all subsequent bytes after the first one (which
4889                 is nul) are zero or nonzero and clear ALLNUL if not.  */
4890              for (const char *p = prep; p != prep + nbytes; ++p)
4891                if (*p)
4892                  {
4893                    *allnul = false;
4894                    break;
4895                  }
Which means we happily read bytes from the "" string beyond the limit.

Reply via email to