RFR(xs): 8168542: os::realloc should return a valid pointer for input size=0

David Holmes david.holmes at oracle.com
Tue Oct 25 05:55:36 UTC 2016


On 25/10/2016 3:50 PM, Thomas Stüfe wrote:
> Hi David,
>
> On Tue, Oct 25, 2016 at 6:22 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Hi Thomas,
>
>     On 24/10/2016 11:12 PM, Thomas Stüfe wrote:
>
>         Dear all,
>
>         please check this tiny bug fix.
>
>         Bug report:
>         https://bugs.openjdk.java.net/browse/JDK-8168542
>         <https://bugs.openjdk.java.net/browse/JDK-8168542>
>
>         Webrev:
>         http://cr.openjdk.java.net/~stuefe/webrevs/8168542-os_realloc_size_0/webrev.00/webrev/
>         <http://cr.openjdk.java.net/~stuefe/webrevs/8168542-os_realloc_size_0/webrev.00/webrev/>
>
>         In short, this fixes a corner case for os::realloc() which currently
>         returns NULL if input size is zero.
>
>         But as we have coding which interprets a return value of NULL as
>         OOM (See
>         ReallocateHeap()), this is not a good solution. It is also
>         inconsistent
>         with how os::malloc() deals with the same situation and
>         potentially with
>         the way the native C-Runtime deals with it (currently, in a
>         debug build we
>         will return NULL in case of size=0 whereas in the release build
>         we just
>         call the native ::realloc() and return whatever it returns.)
>
>
>     Sorry but I do not like this. A native realloc with a size of zero
>     and a non-NULL ptr acts like free(ptr). Our realloc does not do
>     that. A native malloc that receives a size of zero "returns either
>     NULL, or a unique pointer value that can later be successfully
>     passed to free()". Our os::malloc returns 1 - and I see nothing that
>     indicates that can successfully be passed to os::free.
>
>     So while the current handling of size==0 is a bit inconsistent and
>     unclear, it is even less clear that returning 1 is a reasonable
>     thing to do.
>
>     To me passing a size of zero (unless expecting it to act like a
>     free!) is a bug that should be handled in the caller.
>
>
> You completely lost me here. I do not return 1, neither does os::malloc().

Sorry some kind of visual-neural short-circuit. :)

Okay size 0 becomes size 1.

Let me just recant my email and let someone else step in. Thanks for the 
detailed explanation below.

David

> os::realloc behaviour now is:
> - in debug: if size==0, do not free but return NULL immediately. Which
> is not a standard behaviour of a normal ::realloc()
> - in release builds: if size==0, do whatever the C-Runtime realloc()
> does, so it will always free() but either return NULL or a unique pointer.
>
> So, in debug build the behaviour is unexpected and - assuming
> os::realloc() mimicks ::realloc() - wrong. In release builds it will be
> correct but unknown.
>
> My patch changes this behaviour to always - in both release and debug
> builds - free() and return a unique pointer. By setting the size to 1:
>
> - for the debug build, I will go thru the normal path - allocating 1
> byte of memory (plus NMT/guard pages overhead), copying 1 byte of
> payload, then freeing the original memory and returning the alloced 1
> byte - which is unique and can be passed to os::free().
> - for the release build I will force the behaviour to be a realloc to
> size 1 and thus remove the ambiguity introduced by the native realloc.
>
>
>     I welcome opinions from others on this.
>
>     David
>
>     PS. I will be traveling soon and unable to respond to emails until
>     Wednesday afternoon at the earliest.
>
>         Thank you,
>
>         Thomas
>
>
> Kind Regards, Thomas


More information about the hotspot-runtime-dev mailing list