[uClibc]Re: fressh-0.3 works on mipsel. Thanks!
Erik Andersen
andersen at codepoet.org
Thu Oct 17 10:59:37 UTC 2002
On Mon Sep 30, 2002 at 12:27:31PM +0100, Matthew Bloch wrote:
> Here we go, try compiling this program under uClibc and glibc:
First, my appologies for not seeing this email sooner. I just
realized that I never replied.
> ------------------------------- realloc0.c ---------------------------------
> #include <stdlib.h>
>
> int main(int argc, char **argv)
> {
> void *ptr = NULL;
> ptr = realloc(ptr, 0);
> printf("pointer = %p\n", ptr);
> return 0;
> }
> ----------------------------------------------------------------------------
>
> glibc prints a valid pointer, uClibc prints (nil). I suggest that this is a
> uClibc bug because glibc's behaviour is explicit in that "If you pass a null
> pointer for PTR, `realloc' behaves just like `malloc (NEWSIZE)'". uClibc
> will happily return a valid pointer for malloc(0) but realloc(NULL, 0) does
> not behave the same way.
Not true. Regardless of whether uClibc is compiled to include
"malloc-930716" or "malloc", calling malloc(0) returns a NULL.
> Also I only found this bug in uClibc after fixing a bug in the fressh buffer
> allocation routine which relied on an uninitialised pointer being zero;
> updated complete patch attached.
Here's the deal. According to SuSv3:
http://www.opengroup.org/onlinepubs/007904975/functions/realloc.html
If ptr is a null pointer, realloc() shall be equivalent
to malloc() for the specified size.
http://www.opengroup.org/onlinepubs/007904975/functions/malloc.html
If the size of the space requested is 0, the behavior is
implementation-defined: the value returned shall be
either a null pointer or a unique pointer.
So yes, there is a behavior difference between glibc and uClibc.
This is a legitimate, since the standards specify this case to be
implementation-defined. Glibc returns a live pointer (pointing
to some live storage space), which IMHO is terribly stupid and
enables poor programming since people may actually try and _use_
that pointer, and they may actually succeed. uClibc returns a
NULL, which guarantees a richly deserved segfault if someone uses
the NULL pointer.
-Erik
--
Erik B. Andersen http://codepoet-consulting.com/
--This message was written using 73% post-consumer electrons--
More information about the uClibc
mailing list