make malloc(0) return unique pointers rather than NULL
authorRich Felker <dalias@aerifal.cx>
Sun, 20 Feb 2011 21:16:33 +0000 (16:16 -0500)
committerRich Felker <dalias@aerifal.cx>
Sun, 20 Feb 2011 21:16:33 +0000 (16:16 -0500)
this change is made with some reluctance, but i think it's for the
best. correct programs must handle either behavior, so there is little
advantage to having malloc(0) return NULL. and i managed to actually
make the malloc code slightly smaller with this change.

src/malloc/__simple_malloc.c
src/malloc/malloc.c

index c029342c88774b5e6b4e026bc29b82e1b81d18cd..c82939081ba480a21f20ca10d1c1c8dfc586b66d 100644 (file)
@@ -15,7 +15,7 @@ void *__simple_malloc(size_t n)
        static int lock;
        size_t align=1;
 
-       if (!n) return 0;
+       if (!n) n++;
        if (n > SIZE_MAX/2) goto toobig;
 
        while (align<n && align<ALIGN)
index d9a30fe44460c26c2f630c743744c894b50dc855..3c08c41e2fd6be42e765adc76e89113063e47d85 100644 (file)
@@ -216,9 +216,14 @@ static int init_malloc()
 static int adjust_size(size_t *n)
 {
        /* Result of pointer difference must fit in ptrdiff_t. */
-       if (*n > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) {
-               errno = ENOMEM;
-               return -1;
+       if (*n-1 > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) {
+               if (*n) {
+                       errno = ENOMEM;
+                       return -1;
+               } else {
+                       *n = SIZE_ALIGN;
+                       return 0;
+               }
        }
        *n = (*n + OVERHEAD + SIZE_ALIGN - 1) & SIZE_MASK;
        return 0;
@@ -325,7 +330,7 @@ void *malloc(size_t n)
        struct chunk *c;
        int i, j;
 
-       if (!n || adjust_size(&n) < 0) return 0;
+       if (adjust_size(&n) < 0) return 0;
 
        if (n > MMAP_THRESHOLD) {
                size_t len = n + PAGE_SIZE - 1 & -PAGE_SIZE;
@@ -377,7 +382,6 @@ void *realloc(void *p, size_t n)
        void *new;
 
        if (!p) return malloc(n);
-       else if (!n) return free(p), (void *)0;
 
        if (adjust_size(&n) < 0) return 0;