mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-22 03:41:26 +08:00
Make zero size allocation result consistent
The zero size allocations had no consistent behaviour in RTEMS. For example, malloc( 0 ) returned NULL and posix_memalign( &p, align, 0 ) returned in p a unique pointer (or NULL if no memory is available). In POSIX, zero size memory allocations are implementation-defined behaviour. The implementation has two options: https://pubs.opengroup.org/onlinepubs/9699919799/functions/malloc.html https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html Linux and FreeBSD return a unique pointer for zero size memory allocations. Use this approach for RTEMS as well throughout the memory allocation directives Close #4390.
This commit is contained in:
@@ -30,12 +30,6 @@ void *malloc(
|
||||
{
|
||||
void *return_this;
|
||||
|
||||
/*
|
||||
* Validate the parameters
|
||||
*/
|
||||
if ( !size )
|
||||
return (void *) 0;
|
||||
|
||||
return_this = rtems_heap_allocate_aligned_with_boundary( size, 0, 0 );
|
||||
if ( !return_this ) {
|
||||
errno = ENOMEM;
|
||||
|
||||
@@ -106,10 +106,6 @@ void *rtems_heap_allocate_aligned_with_boundary(
|
||||
|
||||
void *rtems_malloc( size_t size )
|
||||
{
|
||||
if ( size == 0 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return rtems_heap_allocate_aligned_with_boundary( size, 0, 0 );
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -53,15 +53,15 @@ void *realloc( void *ptr, size_t size )
|
||||
uintptr_t old_size;
|
||||
uintptr_t avail_size;
|
||||
|
||||
if ( ptr == NULL ) {
|
||||
return malloc( size );
|
||||
}
|
||||
|
||||
if ( size == 0 ) {
|
||||
free( ptr );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ( ptr == NULL ) {
|
||||
return malloc( size );
|
||||
}
|
||||
|
||||
heap = RTEMS_Malloc_Heap;
|
||||
|
||||
switch ( _Malloc_System_state() ) {
|
||||
|
||||
@@ -1153,7 +1153,10 @@ static void test_rtems_malloc(void)
|
||||
void *p;
|
||||
|
||||
p = rtems_malloc(0);
|
||||
rtems_test_assert(p == NULL);
|
||||
rtems_test_assert(p != NULL);
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(p);
|
||||
|
||||
errno = 0;
|
||||
p = rtems_malloc(SIZE_MAX / 2);
|
||||
@@ -1163,6 +1166,7 @@ static void test_rtems_malloc(void)
|
||||
p = rtems_malloc(1);
|
||||
rtems_test_assert(p != NULL);
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(p);
|
||||
}
|
||||
|
||||
@@ -1172,13 +1176,22 @@ static void test_rtems_calloc(void)
|
||||
int *i;
|
||||
|
||||
p = rtems_calloc(0, 0);
|
||||
rtems_test_assert(p == NULL);
|
||||
rtems_test_assert(p != NULL);
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(p);
|
||||
|
||||
p = rtems_calloc(0, 1);
|
||||
rtems_test_assert(p == NULL);
|
||||
rtems_test_assert(p != NULL);
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(p);
|
||||
|
||||
p = rtems_calloc(1, 0);
|
||||
rtems_test_assert(p == NULL);
|
||||
rtems_test_assert(p != NULL);
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(p);
|
||||
|
||||
errno = 0;
|
||||
p = rtems_calloc(1, SIZE_MAX / 2);
|
||||
@@ -1202,6 +1215,8 @@ static void test_rtems_calloc(void)
|
||||
rtems_test_assert(i != NULL);
|
||||
rtems_test_assert(*i == 0);
|
||||
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE(p);
|
||||
free(i);
|
||||
}
|
||||
|
||||
@@ -1301,6 +1316,82 @@ static void test_greedy_allocate(void)
|
||||
rtems_test_assert( p == NULL );
|
||||
}
|
||||
|
||||
static void test_alloc_zero_size(void)
|
||||
{
|
||||
size_t size;
|
||||
void *p;
|
||||
int eno;
|
||||
|
||||
size = 0;
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = malloc( size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = calloc( 1, size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = rtems_malloc( size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = rtems_calloc( 1, size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = NULL;
|
||||
eno = posix_memalign( &p, 32, size );
|
||||
rtems_test_assert( eno == 0 );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = NULL;
|
||||
eno = rtems_memalign( &p, 32, size );
|
||||
rtems_test_assert( eno == 0 );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = aligned_alloc( 32, size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = realloc( NULL, size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( size );
|
||||
p = reallocarray( NULL, 1, size );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
RTEMS_OBFUSCATE_VARIABLE( p );
|
||||
free( p );
|
||||
}
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
@@ -1327,12 +1418,6 @@ rtems_task Init(
|
||||
rtems_test_assert( p1 == NULL );
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
/*
|
||||
* Verify error case where malloc of size 0.
|
||||
*/
|
||||
p1 = malloc( 0 );
|
||||
rtems_test_assert( p1 == NULL );
|
||||
|
||||
test_heap_initialize();
|
||||
test_heap_block_allocate();
|
||||
test_heap_allocate();
|
||||
@@ -1351,6 +1436,7 @@ rtems_task Init(
|
||||
test_rtems_malloc();
|
||||
test_rtems_calloc();
|
||||
test_greedy_allocate();
|
||||
test_alloc_zero_size();
|
||||
|
||||
test_posix_memalign();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user