Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Jun 2006 16:57:05 -0400
From:      Lowell Gilbert <lgusenet@be-well.ilk.org>
To:        freebsd-hackers@freeBSD.org
Subject:   Re: Return value of malloc(0)
Message-ID:  <44odwbu1cu.fsf@be-well.ilk.org>
In-Reply-To: <F08E3BAE0BDAC4061A2A283F@Zelazny> (Pat Lashley's message of "Thu, 29 Jun 2006 15:33:08 -0400")
References:  <20060628181045.GA54915@curry.mchp.siemens.de> <20060628212956.GI822@wombat.fafoe.narf.at> <805AA34B676EDF411B3CF548@Zelazny> <20060629165629.GA6875@britannica.bec.de> <F08E3BAE0BDAC4061A2A283F@Zelazny>

next in thread | previous in thread | raw e-mail | index | archive | help
Pat Lashley <patl+freebsd@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".



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44odwbu1cu.fsf>