@@ -347,6 +347,112 @@ TEST_BEGIN(test_extra_huge)
347347}
348348TEST_END
349349
350+ static void
351+ print_filled_extents (const void * p , uint8_t c , size_t len )
352+ {
353+ const uint8_t * pc = (const uint8_t * )p ;
354+ size_t i , range0 ;
355+ uint8_t c0 ;
356+
357+ malloc_printf (" p=%p, c=%#x, len=%zu:" , p , c , len );
358+ range0 = 0 ;
359+ c0 = pc [0 ];
360+ for (i = 0 ; i < len ; i ++ ) {
361+ if (pc [i ] != c0 ) {
362+ malloc_printf (" %#x[%zu..%zu)" , c0 , range0 , i );
363+ range0 = i ;
364+ c0 = pc [i ];
365+ }
366+ }
367+ malloc_printf (" %#x[%zu..%zu)\n" , c0 , range0 , i );
368+ }
369+
370+ static bool
371+ validate_fill (const void * p , uint8_t c , size_t offset , size_t len )
372+ {
373+ const uint8_t * pc = (const uint8_t * )p ;
374+ bool err ;
375+ size_t i ;
376+
377+ for (i = offset , err = false; i < offset + len ; i ++ ) {
378+ if (pc [i ] != c )
379+ err = true;
380+ }
381+
382+ if (err )
383+ print_filled_extents (p , c , offset + len );
384+
385+ return (err );
386+ }
387+
388+ static void
389+ test_zero (size_t szmin , size_t szmax )
390+ {
391+ size_t sz , nsz ;
392+ void * p ;
393+ #define FILL_BYTE 0x7aU
394+
395+ sz = szmax ;
396+ p = mallocx (sz , MALLOCX_ZERO );
397+ assert_ptr_not_null (p , "Unexpected mallocx() error" );
398+ assert_false (validate_fill (p , 0x00 , 0 , sz ), "Memory not filled: sz=%zu" ,
399+ sz );
400+
401+ /*
402+ * Fill with non-zero so that non-debug builds are more likely to detect
403+ * errors.
404+ */
405+ memset (p , FILL_BYTE , sz );
406+ assert_false (validate_fill (p , FILL_BYTE , 0 , sz ),
407+ "Memory not filled: sz=%zu" , sz );
408+
409+ /* Shrink in place so that we can expect growing in place to succeed. */
410+ sz = szmin ;
411+ assert_zu_eq (xallocx (p , sz , 0 , MALLOCX_ZERO ), sz ,
412+ "Unexpected xallocx() error" );
413+ assert_false (validate_fill (p , FILL_BYTE , 0 , sz ),
414+ "Memory not filled: sz=%zu" , sz );
415+
416+ for (sz = szmin ; sz < szmax ; sz = nsz ) {
417+ nsz = nallocx (sz + 1 , MALLOCX_ZERO );
418+ assert_zu_eq (xallocx (p , sz + 1 , 0 , MALLOCX_ZERO ), nsz ,
419+ "Unexpected xallocx() failure" );
420+ assert_false (validate_fill (p , FILL_BYTE , 0 , sz ),
421+ "Memory not filled: sz=%zu" , sz );
422+ assert_false (validate_fill (p , 0x00 , sz , nsz - sz ),
423+ "Memory not filled: sz=%zu, nsz-sz=%zu" , sz , nsz - sz );
424+ memset ((void * )((uintptr_t )p + sz ), FILL_BYTE , nsz - sz );
425+ assert_false (validate_fill (p , FILL_BYTE , 0 , nsz ),
426+ "Memory not filled: nsz=%zu" , nsz );
427+ }
428+
429+ dallocx (p , 0 );
430+ }
431+
432+ TEST_BEGIN (test_zero_large )
433+ {
434+ size_t large0 , largemax ;
435+
436+ /* Get size classes. */
437+ large0 = get_large_size (0 );
438+ largemax = get_large_size (get_nlarge ()- 1 );
439+
440+ test_zero (large0 , largemax );
441+ }
442+ TEST_END
443+
444+ TEST_BEGIN (test_zero_huge )
445+ {
446+ size_t huge0 , huge1 ;
447+
448+ /* Get size classes. */
449+ huge0 = get_huge_size (0 );
450+ huge1 = get_huge_size (1 );
451+
452+ test_zero (huge1 , huge0 * 2 );
453+ }
454+ TEST_END
455+
350456int
351457main (void )
352458{
@@ -359,5 +465,7 @@ main(void)
359465 test_size_extra_overflow ,
360466 test_extra_small ,
361467 test_extra_large ,
362- test_extra_huge ));
468+ test_extra_huge ,
469+ test_zero_large ,
470+ test_zero_huge ));
363471}
0 commit comments