diff -r cd418898af5c -r 2f601274bbac tests/test_allocator.c --- a/tests/test_allocator.c Thu Oct 31 14:54:44 2024 +0100 +++ b/tests/test_allocator.c Thu Oct 31 17:53:55 2024 +0100 @@ -28,7 +28,13 @@ #include "cx/test.h" +#if __GNUC__ +// we want to perform overflow tests, but we don't want warnings about them +#define __alloc_size__(...) // NOLINT(*-reserved-identifier) +#endif + #include "cx/allocator.h" +#include CX_TEST(test_allocator_default) { CX_TEST_DO { @@ -68,6 +74,29 @@ free(test); } +CX_TEST(test_allocator_default_reallocarray) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + test = cxReallocArray(cxDefaultAllocator, test, 16, 2); + CX_TEST_ASSERT(test != NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + +CX_TEST(test_allocator_default_reallocarray_overflow) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + void *fail = cxReallocArray(cxDefaultAllocator, test, SIZE_MAX/2, 4); + CX_TEST_ASSERT(errno == ENOMEM); + CX_TEST_ASSERT(fail == NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + CX_TEST(test_allocator_default_free) { void *test = malloc(16); CX_TEST_DO { @@ -78,7 +107,7 @@ } CX_TEST(test_allocator_reallocate) { - void *test = calloc(8, 1); + char *test = calloc(8, 1); memcpy(test, "Test", 5); CX_TEST_DO { int ret = cxReallocate(cxDefaultAllocator, &test, 16); @@ -101,6 +130,56 @@ free(test); } +CX_TEST(test_allocator_reallocatearray) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + int ret = cxReallocateArray(cxDefaultAllocator, &test, 16, 2); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(test != NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + +CX_TEST(test_allocator_reallocatearray_overflow) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + int ret = cxReallocateArray(cxDefaultAllocator, &test, SIZE_MAX/2, 4); + CX_TEST_ASSERT(ret != 0); + CX_TEST_ASSERT(errno == ENOMEM); + CX_TEST_ASSERT(test != NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + +CX_TEST(test_allocator_reallocatearray_low_level) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + int ret = cx_reallocatearray(&test, 16, 2); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(test != NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + +CX_TEST(test_allocator_reallocatearray_low_level_overflow) { + char *test = calloc(8, 1); + memcpy(test, "Test", 5); + CX_TEST_DO { + int ret = cx_reallocatearray(&test, SIZE_MAX/2, 4); + CX_TEST_ASSERT(ret != 0); + CX_TEST_ASSERT(errno == ENOMEM); + CX_TEST_ASSERT(test != NULL); + CX_TEST_ASSERT(0 == strcmp(test, "Test")); + } + free(test); +} + static void *test_allocator_mock_failing_realloc( __attribute__((__unused__))void *p, __attribute__((__unused__))void *d, @@ -136,10 +215,16 @@ cx_test_register(suite, test_allocator_default_malloc); cx_test_register(suite, test_allocator_default_calloc); cx_test_register(suite, test_allocator_default_realloc); + cx_test_register(suite, test_allocator_default_reallocarray); + cx_test_register(suite, test_allocator_default_reallocarray_overflow); cx_test_register(suite, test_allocator_default_free); cx_test_register(suite, test_allocator_reallocate); cx_test_register(suite, test_allocator_reallocate_fails); cx_test_register(suite, test_allocator_reallocate_low_level); + cx_test_register(suite, test_allocator_reallocatearray); + cx_test_register(suite, test_allocator_reallocatearray_overflow); + cx_test_register(suite, test_allocator_reallocatearray_low_level); + cx_test_register(suite, test_allocator_reallocatearray_low_level_overflow); return suite; }