![]() |
|
Message-ID: <3cx3oylv6hid2eunibcre7c5oqncuxkrk25x2plme2fqzmdpsf@sh7tmopzzgd5>
Date: Thu, 19 Jun 2025 15:57:47 +0200
From: Alejandro Colomar <alx@...nel.org>
To: linux-man@...r.kernel.org
Cc: musl@...ts.openwall.com, libc-alpha@...rceware.org,
Paul Eggert <eggert@...ucla.edu>, Bruno Haible <bruno@...sp.org>, bug-gnulib@....org
Subject: [v2] malloc.3: Clarify realloc(3) standards conformance
Hi,
Here's a revision of this change, addressing some concerns. I'm only
showing the formatted changes, since the patch itself is unimportant.
Have a lovely day!
Alex
---
$ MANWIDTH=72 diffman-git HEAD
--- HEAD^:man/man3/malloc.3
+++ HEAD:man/man3/malloc.3
@@ -126,15 +126,32 @@
│ realloc() │ │ │
└────────────────────────────────────┴───────────────┴─────────┘
+VERSIONS
+ The behavior of realloc(p, 0) in glibc doesn’t conform to any of
+ C99, C11, POSIX.1‐2001, POSIX.1‐2008, POSIX.1‐2017, or
+ POSIX.1‐2024. The C17 specification was changed to make it con‐
+ forming, but that specification was broken —it is impossible to
+ write code that works portably—, and C23 changed it again to
+ make this undefined behavior, acknowledging that the C17 speci‐
+ fication was broad enough that undefined behavior wasn’t worse
+ than that.
+
+ musl libc conforms to all versions of ISO C and POSIX.1.
+
+ gnulib provides the realloc‐posix module, which provides a wrap‐
+ per realloc() that conforms to POSIX.1‐2024.
+
+ reallocarray() suffers the same issues in glibc.
+
STANDARDS
malloc()
free()
calloc()
realloc()
- C11, POSIX.1‐2008.
+ C23, POSIX.1‐2024.
reallocarray()
- None.
+ POSIX.1‐2024.
HISTORY
malloc()
@@ -214,6 +231,22 @@
POSIX and the C standard do not allow replacement of malloc(),
free(), calloc(), and realloc().
+BUGS
+ Programmers would naturally expect that realloc(p, size) is con‐
+ sistent with free(p) and malloc(size). This is not explicitly
+ required by POSIX.1‐2024 or C11, but all conforming implementa‐
+ tions are consistent with that.
+
+ The glibc implementation of realloc() is not consistent with
+ that, and as a consequence, it is dangerous to call
+ realloc(p, 0) in glibc.
+
+ A trivial workaround for glibc is calling it as
+ realloc(p, size?size:1).
+
+ The workaround for reallocarray() in glibc —which shares the
+ same bug— would be reallocarray(p, n?n:1, size?size:1).
+
EXAMPLES
#include <err.h>
#include <stddef.h>
--
<https://www.alejandro-colomar.es/>
Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.