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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|jakub at gcc dot gnu.org           |msebor at gcc dot 
gnu.org

--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
There's no need for two functions: their results couldn't be used with the
current design.  The problem is that handle_store treats the two MEM_REFs the
same and the pass isn't set up to simultaneously track the lengths of two
different things (a char* and char**) with the same SSA_NAME.  A simple fix,
when the storing a pointer as opposed to an array, is to just return the size
of the pointer and not also the length of what it points to, like this:

diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index b76b54efbd8..bf2a9d0c5d7 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -4697,9 +4697,17 @@ count_nonzero_bytes (tree exp, unsigned HOST_WIDE_INT
offset,
   if (TREE_CODE (exp) == ADDR_EXPR)
     {
       /* If the size of the access hasn't been determined yet it's that
-        of a pointer.  */
+        of a pointer.  In that case, ignore the lengths of what it points
+        to and simply return the range of lengths of its representation.  */
       if (!nbytes)
-       nbytes = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
+       {
+         lenrange[0] = 0;
+         lenrange[1] = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
+         lenrange[2] = lenrange[1];
+         *allnul = false;
+         *nulterm = false;
+         return true;
+       }
       exp = TREE_OPERAND (exp, 0);
     }

Reply via email to