From 18f8dcfa10d8a858b152d12a9ad8fa83b7e967f0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 20 Aug 2019 12:28:02 +0100 Subject: [PATCH] bpo-37732: Fix GCC warning in _PyObject_Malloc() (GH-15333) pymalloc_alloc() now returns directly the pointer, return NULL on memory allocation error. allocate_from_new_pool() already uses NULL as marker for "allocation failed". --- Objects/obmalloc.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 6ca7cd84eda..40c098ddc30 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1580,35 +1580,35 @@ allocate_from_new_pool(uint size) /* pymalloc allocator - Return 1 if pymalloc allocated memory and wrote the pointer into *ptr_p. + Return a pointer to newly allocated memory if pymalloc allocated memory. - Return 0 if pymalloc failed to allocate the memory block: on bigger + Return NULL if pymalloc failed to allocate the memory block: on bigger requests, on error in the code below (as a last chance to serve the request) or when the max memory limit has been reached. */ -static inline int -pymalloc_alloc(void *ctx, void **ptr_p, size_t nbytes) +static inline void* +pymalloc_alloc(void *ctx, size_t nbytes) { #ifdef WITH_VALGRIND if (UNLIKELY(running_on_valgrind == -1)) { running_on_valgrind = RUNNING_ON_VALGRIND; } if (UNLIKELY(running_on_valgrind)) { - return 0; + return NULL; } #endif if (UNLIKELY(nbytes == 0)) { - return 0; + return NULL; } if (UNLIKELY(nbytes > SMALL_REQUEST_THRESHOLD)) { - return 0; + return NULL; } uint size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; poolp pool = usedpools[size + size]; block *bp; - + if (LIKELY(pool != pool->nextpool)) { /* * There is a used pool for this size class. @@ -1616,6 +1616,7 @@ pymalloc_alloc(void *ctx, void **ptr_p, size_t nbytes) */ ++pool->ref.count; bp = pool->freeblock; + assert(bp != NULL); if (UNLIKELY((pool->freeblock = *(block **)bp) == NULL)) { // Reached the end of the free list, try to extend it. @@ -1627,22 +1628,17 @@ pymalloc_alloc(void *ctx, void **ptr_p, size_t nbytes) * available: use a free pool. */ bp = allocate_from_new_pool(size); - if (UNLIKELY(bp == NULL)) { - return 0; - } } - assert(bp != NULL); - *ptr_p = (void *)bp; - return 1; + return (void *)bp; } static void * _PyObject_Malloc(void *ctx, size_t nbytes) { - void* ptr; - if (LIKELY(pymalloc_alloc(ctx, &ptr, nbytes))) { + void* ptr = pymalloc_alloc(ctx, nbytes); + if (LIKELY(ptr != NULL)) { return ptr; } @@ -1657,12 +1653,11 @@ _PyObject_Malloc(void *ctx, size_t nbytes) static void * _PyObject_Calloc(void *ctx, size_t nelem, size_t elsize) { - void* ptr; - assert(elsize == 0 || nelem <= (size_t)PY_SSIZE_T_MAX / elsize); size_t nbytes = nelem * elsize; - if (LIKELY(pymalloc_alloc(ctx, &ptr, nbytes))) { + void* ptr = pymalloc_alloc(ctx, nbytes); + if (LIKELY(ptr != NULL)) { memset(ptr, 0, nbytes); return ptr; } @@ -1711,8 +1706,8 @@ insert_to_freepool(poolp pool) * are no arenas in usable_arenas with that value. */ struct arena_object* lastnf = nfp2lasta[nf]; - assert((nf == 0 && lastnf == NULL) || - (nf > 0 && + assert((nf == 0 && lastnf == NULL) || + (nf > 0 && lastnf != NULL && lastnf->nfreepools == nf && (lastnf->nextarena == NULL ||