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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
            Summary|warning: ‘memcpy’:          |[7.0 regression] warning:
                   |specified size between      |‘memcpy’: specified size
                   |18446744071562067968 and    |between
                   |18446744073709551615        |18446744071562067968 and
                   |exceeds maximum object size |18446744073709551615
                   |9223372036854775807         |exceeds maximum object size
                   |[-Wstringop-overflow=]      |9223372036854775807
                   |                            |[-Wstringop-overflow=]
           Severity|enhancement                 |normal

--- Comment #4 from Martin Sebor <msebor at gcc dot gnu.org> ---
Thanks.  The range printed in the diagnostic corresponds to the range of the
signed variable passed to memcpy() after conversion to size_t.  The (signed)
range is reported by the get_range_info() function as [-2147483648, -1].  The
converted variable's def_stmt looks like this:

  _309 = (long unsigned int) len_137;

The range of the len_137 variable whose type is int is [-2147483648,
2147483647], or the full range of its type, so the unsigned range has to be
considered to be [0, SIZE_MAX].  I'm testing a patch to detect this and avoid
the false positive.

Reply via email to