Am 06.09.25 um 21:44 schrieb Alan Cox:
I would disagree with your interpretation re C90. It's possible to
allocate zero bytes, it's just metadata tracking space that is allocated
but it's not an impossible act. So I believe you are compliant with C90
anyway. They just made it more explicit.
Classic Unix returned a pointer for zero sized allocations and realloc.
Well, the C90 wording is somewhat unclear:
#include <stdlib.h>
void *realloc(void *ptr, size-t size);
Description
The realloc function changes the size of the object pointed to by ptr to
the size specified by size. The contents of the object shall be
unchanged up to the lesser of the new and old sizes. If the new size is
larger, the value of the newly allocated portion of the object is
indeterminate. If ptr is a null pointer, the realloc function behaves
like the malloc function for the specified size. Otherwise, if ptr does
not match a pointer earlier returned by the calloc, malloc, or realloc
function, or if the space has been deallocated by a call to the free
or realloc function. the behavior is undefined. If the space cannot be
allocated, the object pointed to by ptr is unchanged. If size is zero
and ptr is not a null pointer, the object it points to is freed.
Returns
The realloc function returns either a null pointer or a pointer to the
possibly moved allocated space.
My understanding was that this would require realloc(ptr, 0) to free and
return a null pointer. AFAIK, that was also the understanding glibc came
up with.
From the C99 rationale, this was apparently an obvious, but not
necessarily desired understanding: "C89 appeared to require a null
return value, and the Committee felt that this was too restrictive."
I'll probably change the manual to state that C90 is unclear here, and
sdcc might or might not conform.
Philipp
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user