1 #include "test/jemalloc_test.h" 2 3 #define CHUNK 0x400000 4 #define MAXALIGN (((size_t)1) << 23) 5 6 /* 7 * On systems which can't merge extents, tests that call this function generate 8 * a lot of dirty memory very quickly. Purging between cycles mitigates 9 * potential OOM on e.g. 32-bit Windows. 10 */ 11 static void 12 purge(void) 13 { 14 15 assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, 16 "Unexpected mallctl error"); 17 } 18 19 TEST_BEGIN(test_alignment_errors) 20 { 21 size_t alignment; 22 void *p; 23 24 for (alignment = 0; alignment < sizeof(void *); alignment++) { 25 assert_d_eq(posix_memalign(&p, alignment, 1), EINVAL, 26 "Expected error for invalid alignment %zu", 27 alignment); 28 } 29 30 for (alignment = sizeof(size_t); alignment < MAXALIGN; 31 alignment <<= 1) { 32 assert_d_ne(posix_memalign(&p, alignment + 1, 1), 0, 33 "Expected error for invalid alignment %zu", 34 alignment + 1); 35 } 36 } 37 TEST_END 38 39 TEST_BEGIN(test_oom_errors) 40 { 41 size_t alignment, size; 42 void *p; 43 44 #if LG_SIZEOF_PTR == 3 45 alignment = UINT64_C(0x8000000000000000); 46 size = UINT64_C(0x8000000000000000); 47 #else 48 alignment = 0x80000000LU; 49 size = 0x80000000LU; 50 #endif 51 assert_d_ne(posix_memalign(&p, alignment, size), 0, 52 "Expected error for posix_memalign(&p, %zu, %zu)", 53 alignment, size); 54 55 #if LG_SIZEOF_PTR == 3 56 alignment = UINT64_C(0x4000000000000000); 57 size = UINT64_C(0xc000000000000001); 58 #else 59 alignment = 0x40000000LU; 60 size = 0xc0000001LU; 61 #endif 62 assert_d_ne(posix_memalign(&p, alignment, size), 0, 63 "Expected error for posix_memalign(&p, %zu, %zu)", 64 alignment, size); 65 66 alignment = 0x10LU; 67 #if LG_SIZEOF_PTR == 3 68 size = UINT64_C(0xfffffffffffffff0); 69 #else 70 size = 0xfffffff0LU; 71 #endif 72 assert_d_ne(posix_memalign(&p, alignment, size), 0, 73 "Expected error for posix_memalign(&p, %zu, %zu)", 74 alignment, size); 75 } 76 TEST_END 77 78 TEST_BEGIN(test_alignment_and_size) 79 { 80 #define NITER 4 81 size_t alignment, size, total; 82 unsigned i; 83 int err; 84 void *ps[NITER]; 85 86 for (i = 0; i < NITER; i++) 87 ps[i] = NULL; 88 89 for (alignment = 8; 90 alignment <= MAXALIGN; 91 alignment <<= 1) { 92 total = 0; 93 for (size = 1; 94 size < 3 * alignment && size < (1U << 31); 95 size += (alignment >> (LG_SIZEOF_PTR-1)) - 1) { 96 for (i = 0; i < NITER; i++) { 97 err = posix_memalign(&ps[i], 98 alignment, size); 99 if (err) { 100 char buf[BUFERROR_BUF]; 101 102 buferror(get_errno(), buf, sizeof(buf)); 103 test_fail( 104 "Error for alignment=%zu, " 105 "size=%zu (%#zx): %s", 106 alignment, size, size, buf); 107 } 108 total += malloc_usable_size(ps[i]); 109 if (total >= (MAXALIGN << 1)) 110 break; 111 } 112 for (i = 0; i < NITER; i++) { 113 if (ps[i] != NULL) { 114 free(ps[i]); 115 ps[i] = NULL; 116 } 117 } 118 } 119 purge(); 120 } 121 #undef NITER 122 } 123 TEST_END 124 125 int 126 main(void) 127 { 128 129 return (test( 130 test_alignment_errors, 131 test_oom_errors, 132 test_alignment_and_size)); 133 } 134