1 #include "test/jemalloc_test.h" 2 3 #ifdef JEMALLOC_FILL 4 const char *malloc_conf = 5 "abort:false,junk:false,zero:true,redzone:false,quarantine:0"; 6 #endif 7 8 static void 9 test_zero(size_t sz_min, size_t sz_max) 10 { 11 char *s; 12 size_t sz_prev, sz, i; 13 14 sz_prev = 0; 15 s = (char *)mallocx(sz_min, 0); 16 assert_ptr_not_null((void *)s, "Unexpected mallocx() failure"); 17 18 for (sz = sallocx(s, 0); sz <= sz_max; 19 sz_prev = sz, sz = sallocx(s, 0)) { 20 if (sz_prev > 0) { 21 assert_c_eq(s[0], 'a', 22 "Previously allocated byte %zu/%zu is corrupted", 23 ZU(0), sz_prev); 24 assert_c_eq(s[sz_prev-1], 'a', 25 "Previously allocated byte %zu/%zu is corrupted", 26 sz_prev-1, sz_prev); 27 } 28 29 for (i = sz_prev; i < sz; i++) { 30 assert_c_eq(s[i], 0x0, 31 "Newly allocated byte %zu/%zu isn't zero-filled", 32 i, sz); 33 s[i] = 'a'; 34 } 35 36 if (xallocx(s, sz+1, 0, 0) == sz) { 37 s = (char *)rallocx(s, sz+1, 0); 38 assert_ptr_not_null((void *)s, 39 "Unexpected rallocx() failure"); 40 } 41 } 42 43 dallocx(s, 0); 44 } 45 46 TEST_BEGIN(test_zero_small) 47 { 48 49 test_skip_if(!config_fill); 50 test_zero(1, SMALL_MAXCLASS-1); 51 } 52 TEST_END 53 54 TEST_BEGIN(test_zero_large) 55 { 56 57 test_skip_if(!config_fill); 58 test_zero(SMALL_MAXCLASS+1, large_maxclass); 59 } 60 TEST_END 61 62 TEST_BEGIN(test_zero_huge) 63 { 64 65 test_skip_if(!config_fill); 66 test_zero(large_maxclass+1, chunksize*2); 67 } 68 TEST_END 69 70 int 71 main(void) 72 { 73 74 return (test( 75 test_zero_small, 76 test_zero_large, 77 test_zero_huge)); 78 } 79