From: "Lasse Kärkkäinen" <tronic-ze05kZMmeybHOG6cAo2yLw@public.gmane.org>
To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Error in man page: realloc(ptr, 0) is not equivalent to free(ptr)
Date: Thu, 21 Feb 2008 08:26:55 +0200 [thread overview]
Message-ID: <47BD19AF.4000101@trn.iki.fi> (raw)
The man page says that realloc(ptr, 0) is equivalent to free, even
though it isn't. The text on the man page says
---
realloc() changes the size of the memory block pointed to by ptr to
size bytes. The contents will be unchanged to the minimum of the old
and new sizes; newly allocated memory will be uninitialized. If
ptr is NULL, the call is equivalent to malloc(size); if size is equal
to zero, the call is equivalent to free(ptr). Unless ptr is NULL, it
must have been returned by an earlier call to malloc(), calloc() or
realloc(). If the area pointed to was moved, a free(ptr) is done.
[...]
realloc() returns a pointer to the newly allocated memory, which is
suitably aligned for any kind of variable and may be different from ptr,
or NULL if the request fails. If size was equal to 0, either NULL or
a pointer suitable to be passed to free() is returned. If realloc()
fails the original block is left untouched; it is not freed or moved.
---
The C99 standard says:
---
7.20.3.4 The realloc function
Synopsis
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
Description
The realloc function deallocates the old object pointed to by ptr and
returns a pointer to a new object that has the size specified by size.
The contents of the new object shall be the same as that of the old
object prior to deallocation, up to the lesser of the new and old sizes.
Any bytes in the new object beyond the size of the old object have
indeterminate values.
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 memory for the new object cannot
be allocated, the old object is not deallocated and its value is unchanged.
Returns
The realloc function returns a pointer to the new object (which may have
the same value as a pointer to the old object), or a null pointer if the
new object could not be allocated.
---
glibc implements the behavior specified by the standard, not that
specified on the man page. realloc(NULL, 0) is equivalent to malloc(24),
actually allocating the minimum block (which is 24 bytes at least on my
architecture) instead of doing nothing like free(NULL) does.
One test case to demonstrate this:
#include <stdlib.h>
int main(void) {
void* ptr = malloc(100);
// Man page says this is equivalent to free(ptr)
ptr = realloc(ptr, 0);
// ... but according to Valgrind, this program leaks memory,
// unless you add
free(ptr);
// ... which should be invalid (double free)
}
Another one (as requested by jeffz on #gnu):
#include <stdlib.h>
int main(void) {
for (size_t i = 0; i < 0x7FFFFFFF; ++i) {
void* ptr = realloc(NULL, 0);
}
}
According to the man page, this program should not allocate any memory,
but it ends up allocating several gigabytes until OOM killer takes care
of it.
next reply other threads:[~2008-02-21 6:26 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-21 6:26 Lasse Kärkkäinen [this message]
[not found] ` <47BD19AF.4000101-ze05kZMmeybHOG6cAo2yLw@public.gmane.org>
2008-02-21 6:59 ` Error in man page: realloc(ptr, 0) is not equivalent to free(ptr) Mike Frysinger
[not found] ` <200802210159.03465.vapier-aBrp7R+bbdUdnm+yROfE0A@public.gmane.org>
2008-02-22 10:15 ` Michael Kerrisk
[not found] ` <cfd18e0f0802220215l6e61ab90h4a2d9b2e3e2a194d-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-02-23 6:38 ` Mike Frysinger
[not found] ` <200802230138.11461.vapier-aBrp7R+bbdUdnm+yROfE0A@public.gmane.org>
2008-02-26 15:12 ` Michael Kerrisk
2008-02-23 8:10 ` Chris "ク" Heath
[not found] ` <1203754246.3021.104.camel-DBi1IKlRe8YXiSwHZUBl+UgmxNRb6L7S@public.gmane.org>
2008-02-23 8:41 ` Mike Frysinger
2008-02-26 15:12 ` Michael Kerrisk
[not found] ` <47C42C68.405-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-03-02 13:01 ` Michael Kerrisk
[not found] ` <cfd18e0f0803020501y4e803b6dk5479db1f1f36b37-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-03-02 23:53 ` Chris "ク" Heath
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47BD19AF.4000101@trn.iki.fi \
--to=tronic-ze05kzmmeybhog6cao2ylw@public.gmane.org \
--cc=linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox