diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/malloc.c | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/regression/tests/malloc.c')
| -rw-r--r-- | support/regression/tests/malloc.c | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/support/regression/tests/malloc.c b/support/regression/tests/malloc.c new file mode 100644 index 0000000..934a4d5 --- /dev/null +++ b/support/regression/tests/malloc.c @@ -0,0 +1,222 @@ +/* Simple malloc tests. + */ +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#if defined(__SDCC_pic16) +#include <malloc.h> +#endif +#include <testfwk.h> + +#if defined(__SDCC_pic16) +__xdata char heap[100]; +#endif + +void mallocfree(void) +{ +#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory + char *a, *b, *c; + char d[25]; + + LOG (("mallocfree()\n")); + + a = malloc(16); + ASSERT(a); + memset(a, 2, 16); + b = malloc(16); + ASSERT(b); + memset(b, 1, 16); + c = calloc(16, 1); + ASSERT(c); +#ifndef PORT_HOST + LOG (("1 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + memset(d, 2, 16); + ASSERT(!memcmp(d, a, 16)); + memset(d, 1, 16); + ASSERT(!memcmp(d, b, 16)); + memset(d, 0, 16); + ASSERT(!memcmp(d, c, 16)); + + free(b); + b = malloc(20); + memset(b, 3, 20); +#ifndef PORT_HOST + LOG (("2 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + memset(d, 2, 16); + ASSERT(!memcmp(d, a, 16)); + memset(d, 3, 20); + ASSERT(!memcmp(d, b, 20)); + memset(d, 0, 16); + ASSERT(!memcmp(d, c, 16)); + + free(b); + b = malloc(10); + memset(b, 4, 10); +#ifndef PORT_HOST + LOG (("3 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + memset(d, 2, 16); + ASSERT(!memcmp(d, a, 16)); + memset(d, 4, 20); + ASSERT(!memcmp(d, b, 10)); + memset(d, 0, 16); + ASSERT(!memcmp(d, c, 16)); + + free(b); + b = malloc(8); + memset(b, 5, 8); + b = realloc(b, 4); + memset(d, 5, 8); + ASSERT(!memcmp(d, b, 4)); +#ifndef PORT_HOST + LOG (("4 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + + free(a); + b = realloc(b, 8); + ASSERT(!memcmp(d, b, 4)); + +#ifndef PORT_HOST + LOG (("5 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + free(b); +#ifndef PORT_HOST + LOG (("6 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + free(c); +#ifndef PORT_HOST + LOG (("7 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + + a = malloc(10); + memset(a, 6, 10); + b = malloc(10); + memset(b, 7, 10); + c = malloc(10); + memset(c, 8, 10); +#ifndef PORT_HOST + LOG (("8 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + + free(b); + a = realloc(a, 25); + memset(a + 10, 6, 15); +#ifndef PORT_HOST + LOG (("9 a %u b %u c %u\n", (unsigned)a, (unsigned)b, (unsigned)c)); +#endif + + memset(d, 6, 25); + ASSERT(!memcmp(d, a, 25)); + memset(d, 8, 10); + ASSERT(!memcmp(d, c, 10)); + + free(a); + free(c); + + /* Check that we can allocate at least 256 bytes at once. */ +#if defined(PORT_HOST) || defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_r2k) || defined(__SDCC_r3ka) + a = malloc(256); + ASSERT(a); + free(a); +#endif + + /* Check for overflow in calloc() memory size calculation, bug #2650. */ +#ifndef PORT_HOST + c = calloc(SIZE_MAX / 256, 258); + ASSERT(!c); +#endif +#endif +} + +void +testMalloc (void) +{ +#ifndef __SDCC_pdk14 + void __xdata *p1, *p2, *p3; + char *p; + unsigned char i; + + +#if defined(__SDCC_pic16) + _initHeap (heap, sizeof heap); +#endif + +#ifndef PORT_HOST + p1 = malloc (0xFFFF); + ASSERT (p1 == NULL); + LOG (("p1 == NULL when out of memory\n")); +#endif + +#if !defined(PORT_HOST) && !defined(__SDCC_gbz80) && !defined(__SDCC_z80) + p1 = malloc (2000); + ASSERT (p1 == NULL); + LOG (("p1 == NULL when out of memory\n")); +#ifdef PORT_HOST + LOG (("p1: %p\n", p1)); +#else + LOG (("p1: %u\n", (unsigned) p1)); +#endif +#endif + + p1 = malloc (5); + ASSERT (p1 != NULL); +#ifdef PORT_HOST + LOG (("p1: %p\n", p1)); +#else + LOG (("p1: %u\n", (unsigned) p1)); +#endif + + p2 = malloc (20); + ASSERT (p2 != NULL); +#ifdef PORT_HOST + LOG (("p2: %p\n", p2)); +#else + LOG (("p2: %u\n", (unsigned) p2)); +#endif + + p = (char*)p2; + for (i = 0; i < 20; i++, p++) + *p = i; + + p2 = realloc (p2, 25); + ASSERT (p2 != NULL); +#ifdef PORT_HOST + LOG (("p2, after expanding realloc: %p\n", p2)); +#else + LOG (("p2, after expanding realloc: %u\n", (unsigned) p2)); +#endif + + p = (char*)p2; + for (i = 0; i < 20; i++, p++) + ASSERT (*p == i); + + p2 = realloc (p2, 15); + ASSERT (p2 != NULL); +#ifdef PORT_HOST + LOG (("p2, after shrinking realloc: %p\n", p2)); +#else + LOG (("p2, after shrinking realloc: %u\n", (unsigned) p2)); +#endif + + p = (char*)p2; + for (i = 0; i < 15; i++, p++) + ASSERT (*p == i); + + free (p2); + + p3 = malloc (10); + ASSERT (p3 != NULL); +#ifdef PORT_HOST + LOG (("p3, after freeing p2: %p\n", p3)); +#else + LOG (("p3, after freeing p2: %u\n", (unsigned) p3)); +#endif + + free (p1); + free (p3); + mallocfree(); +#endif +} + |
