| #include <stdio.h> |
| #include <stdint.h> |
| #include <assert.h> |
| #include <string.h> |
| #include <malloc.h> |
| |
| #define TEST(a, b, msg, ...) do { \ |
| if ((a) != (b)) { \ |
| fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ |
| fprintf(stderr, msg, ##__VA_ARGS__); \ |
| fputc('\n', stderr); \ |
| return 1; \ |
| } \ |
| } while (0) |
| |
| #define TEST_MEM(ptr, byte, size, msg, ...) do { \ |
| size_t i; \ |
| for (i = 0; i < size; i++) { \ |
| if (((unsigned char *)ptr)[i] != (unsigned char)byte) { \ |
| fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ |
| fprintf(stderr, msg, ##__VA_ARGS__); \ |
| fputc('\n', stderr); \ |
| return 1; \ |
| } \ |
| } \ |
| } while (0) |
| |
| int main() { |
| void *ptr; |
| size_t size; |
| |
| |
| /* |
| * Surprisingly this malloc/_msize test is failing on msvcrt10.dll and msvcrt20.dll |
| * because these two CRT libraries are buggy and return _msize rounded to even number. |
| * So it means that also mingw-w64 _aligned_msize function (wrapper around _msize) |
| * returns wrong value when using those two CRT libraries. |
| */ |
| ptr = malloc(231); |
| assert(ptr != NULL); |
| size = _msize(ptr); |
| TEST(size, 231, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| free(ptr); |
| |
| |
| ptr = malloc(1000); |
| assert(ptr != NULL); |
| |
| size = _msize(ptr); |
| TEST(size, 1000, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| memset(ptr, 0x01, 1000); |
| |
| ptr = _recalloc(ptr, 100, 1); |
| assert(ptr != NULL); |
| |
| size = _msize(ptr); |
| TEST(size, 100, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| ptr = _recalloc(ptr, 200, 1); |
| assert(ptr != NULL); |
| |
| size = _msize(ptr); |
| TEST(size, 200, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| TEST_MEM(ptr, 0x01, 100, "_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i); |
| TEST_MEM(ptr+100, 0x00, 100, "_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+100], (unsigned long)i+100); |
| |
| free(ptr); |
| |
| |
| ptr = _aligned_malloc(100, 128); |
| assert(ptr != NULL); |
| TEST((uintptr_t)ptr % 128, 0, "_aligned_malloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 0); |
| TEST(size, 100, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| memset(ptr, 0x01, 100); |
| |
| ptr = _aligned_realloc(ptr, 2000, 128); |
| assert(ptr != NULL); |
| TEST((uintptr_t)ptr % 128, 0, "_aligned_realloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 0); |
| TEST(size, 2000, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| TEST_MEM(ptr, 0x01, 100, "_aligned_realloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i); |
| |
| memset(ptr, 0x02, 2000); |
| |
| ptr = _aligned_realloc(ptr, 10, 128); |
| assert(ptr != NULL); |
| TEST((uintptr_t)ptr % 128, 0, "_aligned_realloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 0); |
| TEST(size, 10, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| ptr = _aligned_recalloc(ptr, 20, 1, 128); |
| assert(ptr != NULL); |
| TEST((uintptr_t)ptr % 128, 0, "_aligned_recalloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 0); |
| TEST(size, 20, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| TEST_MEM(ptr, 0x02, 10, "_aligned_realloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i); |
| TEST_MEM(ptr+10, 0x00, 10, "_aligned_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+10], (unsigned long)i+10); |
| |
| ptr = _aligned_recalloc(ptr, 3, 2, 128); |
| assert(ptr != NULL); |
| TEST((uintptr_t)ptr % 128, 0, "_aligned_recalloc: ptr 0x%p is not aligned", ptr); |
| |
| TEST_MEM(ptr, 0x02, 6, "_aligned_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i); |
| |
| _aligned_free(ptr); |
| |
| |
| ptr = _aligned_offset_malloc(300, 128, 7); |
| TEST((uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_malloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 7); |
| TEST(size, 300, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| ptr = _aligned_offset_realloc(ptr, 3000, 128, 7); |
| assert(ptr != NULL); |
| TEST((uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_realloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 7); |
| TEST(size, 3000, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| memset(ptr, 0x01, 3000); |
| |
| ptr = _aligned_offset_recalloc(ptr, 100, 1, 128, 7); |
| assert(ptr != NULL); |
| TEST((uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_recalloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 7); |
| TEST(size, 100, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| memset(ptr, 0x02, 100); |
| |
| ptr = _aligned_offset_recalloc(ptr, 110, 1, 128, 7); |
| assert(ptr != NULL); |
| TEST((uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_recalloc: ptr 0x%p is not aligned", ptr); |
| |
| size = _aligned_msize(ptr, 128, 7); |
| TEST(size, 110, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size); |
| |
| TEST_MEM(ptr, 0x02, 100, "_aligned_offset_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i); |
| TEST_MEM(ptr+100, 0x00, 10, "_aligned_offset_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+100], (unsigned long)i+100); |
| |
| _aligned_free(ptr); |
| |
| |
| return 0; |
| } |