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

andysem at mail dot ru changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |---

--- Comment #2 from andysem at mail dot ru ---
(In reply to Martin Sebor from comment #1)
> 
> Since n is set to _size + 4 in test(), (n < _size) holds only if the
> addition wraps around zero, implying _size is excessively large.

If `_size + 4` does overflow, the result of memset is still valid (i.e. it is
filling what it is supposed to fill), and the warning is incorrect.

> The
> warning can be avoided by asserting that that isn't so, e.g., by adding the
> following
> 
>           if (_size >= __PTRDIFF_MAX__ / 4)
>             __builtin_unreachable ();
> 
> just before the memset call.

I don't think users should be required to insert non-portable asserts like
these to be able to use memset without warnings.

Besides, this assert is incorrect as it will prevent memset to be called if
(_size >= __PTRDIFF_MAX__ / 4). (Why `/ 4`, BTW?)

I'm reopening because I think, as it currently works, the warning is bogus and
should be fixed. It is not actionable on the user's side and the suggested
workaround is not practical.

Reply via email to