tests/test_allocator.c

changeset 963
2f601274bbac
parent 782
74d777455e96
--- 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 <errno.h>
 
 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;
 }

mercurial