Return value of malloc(0)

Lowell Gilbert lgusenet at be-well.ilk.org
Thu Jun 29 20:57:07 UTC 2006


Pat Lashley <patl+freebsd at volant.org> writes:

>> On Thu, Jun 29, 2006 at 11:44:23AM -0400, Pat Lashley wrote:
>> > No, our implementation is NOT legal.  We always return the SAME value.  To
>> > be legal, we should not return that value again unless it has been
>> > free()-ed.
>>
>> It is legal due to brain damaged definition of implementation defined
>> behaviour, but it violates the spirit of the standard :-)
>
> Perhaps I'm misunderstanding the 'implementation defined behavior'
> choices in the standard.  I thought that it could either 1) Return
> NULL; or 2) Behave as though it returned a 'minimum allocation' (which
> cannot be legally de-referenced).

I went wandering through the C Working Group archives for the heck of
it, and apparently a lot of people were confused over this, thinking
either as you did or that "unique" meant it would a value unique to
the usage of malloc(0).  It's been clarified recently (and will be in
the next revision of the standard) to the meaning you understood.  

Specifically:

    If the size of the space requested is zero, the behavior is
    implementation-defined:  either a null pointer is returned, or the
    behavior is as if the size were some nonzero value, except that
    the returned pointer shall not be used to access an object.

>                                    But if it did actually perform a
> minimum allocation'; wouldn't it have to return a different value
> every time to maintain the free() semantics?

I think that's another way of looking at the same confusion.  If
"minimum" is zero, then using a sentinel value (as in FreeBSD) works.

Our malloc() could be easily fixed to be standards-compliant by
removing the special handling for ZEROSIZEPTR in malloc.c; then
allocations of 0 bytes will be rounded up to 16, just like all other
alloations of less than 16 bytes.  However, that would lose much of
the bug-finding advantage of the current behaviour.

This is wandering into -standards territory, though.  In any case, the
answer to thread's original question is "mozilla should fix its code
to not assume malloc(0)==NULL".


More information about the freebsd-hackers mailing list