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

--- Comment #18 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #14)
> Removing the test for !size from the first conditional avoids the warning. 
> I don't fully understand what the code tries to do but the following avoids
> it at -O2 (only):
> 
> void *xrealloc (void *ptr, int size)
> {
>   if (!size)
>     size = 1;
>   void *ret = __builtin_realloc (ptr, size);
>   if (!ret)
>     ret = __builtin_realloc (ptr, 1);
>   if (!ret) {
>     ret = __builtin_realloc (ptr, size);
>     if (!ret)
>       ret = __builtin_realloc(ptr, 1);
>     if (!ret)
>       __builtin_abort ();
>   }
>   return ret;
> }

This is definitely not what the code meant to do.
If I do xrealloc (malloc (30), 1024 * 1024 * 1024) and it returns non-NULL,
it certainly shouldn't be that it under the hood called realloc (ptr, 1)
because
the first realloc failed.
If you add that if (!size) size = 1;, then I think what is meant is just
  void *ret = __builtin_realloc (ptr, size);
  if (!ret)
    {
      ret = __builtin_realloc (ptr, size);
      if (!ret)
        die (...);
    }
  return ret;

Reply via email to