realloc-posix: realloc (..., 0) now returns nonnull

* lib/realloc.c (rpl_realloc): Simplify and tune by using
HAVE_REALLOC_0_NONNULL and HAVE_MALLOC_PTRDIFF, and
by having just one call to realloc instead of two.
* lib/reallocarray.c (reallocarray): Simplify and tune
by delegating the zero case to the revised realloc.
* m4/eealloc.m4 (_AC_FUNC_REALLOC_IF): Since only eealloc uses
this macro now, move its definition here ...
* m4/realloc.m4: ... from here.
(gl_FUNC_REALLOC_0_NONNULL): Also check that realloc (p, 0)
returns nonnull.  Require gl_FUNC_REALLOC_POSIX.
Define HAVE_REALLOC_0_NONNULL.
* m4/reallocarray.m4 (gl_FUNC_REALLOCARRAY):
Also replace reallocarray if it returns a null pointer for size zero.
* modules/eealloc (Files): Remove m4/realloc.m4.
* modules/realloc-posix (Depends-on): Add extensions-aix.
* modules/reallocarray (Files): Add m4/realloc.m4.
This commit is contained in:
Paul Eggert
2024-11-04 21:40:18 -08:00
parent 8835e92de4
commit d884e6fc4a
12 changed files with 123 additions and 80 deletions
-6
View File
@@ -33,12 +33,6 @@ reallocarray (void *ptr, size_t nmemb, size_t size)
return NULL;
}
/* Work around realloc glitch by treating a 0 size as if it were 1,
to avoid undefined behavior in strict C23 platforms,
and so that returning NULL is equivalent to failing. */
if (nbytes == 0)
nbytes = 1;
/* Call realloc, setting errno to ENOMEM on failure. */
return realloc (ptr, nbytes);
}