@@ -459,9 +459,11 @@ macro_rules! fuzz_mutator {
459459 |
460460 $body: block
461461 ) => {
462- /// Auto-generated function.
462+ /// Auto-generated function. Do not use; only for LibFuzzer's
463+ /// consumption.
463464 #[ export_name = "LLVMFuzzerCustomMutator" ]
464- pub fn rust_fuzzer_custom_mutator(
465+ #[ doc( hidden) ]
466+ pub unsafe fn rust_fuzzer_custom_mutator(
465467 $data: * mut u8 ,
466468 $size: usize ,
467469 $max_size: usize ,
@@ -471,15 +473,26 @@ macro_rules! fuzz_mutator {
471473 // might be larger or smaller than `max_size`. The `data`'s capacity
472474 // is the maximum of the two.
473475 let len = std:: cmp:: max( $max_size, $size) ;
474- let $data: & mut [ u8 ] = unsafe { std:: slice:: from_raw_parts_mut( $data, len) } ;
476+ let $data: & mut [ u8 ] = std:: slice:: from_raw_parts_mut( $data, len) ;
475477
476478 // `unsigned int` is generally a `u32`, but not on all targets. Do
477479 // an infallible (and potentially lossy, but that's okay because it
478480 // preserves determinism) conversion.
479481 let $seed = $seed as u32 ;
480482
483+ // Define and invoke a new, safe function so that the body doesn't
484+ // inherit `unsafe`.
485+ fn custom_mutator(
486+ $data: & mut [ u8 ] ,
487+ $size: usize ,
488+ $max_size: usize ,
489+ $seed: u32 ,
490+ ) -> usize {
491+ $body
492+ }
493+ let new_size = custom_mutator( $data, $size, $max_size, $seed) ;
494+
481495 // Truncate the new size if it is larger than the max.
482- let new_size = { $body } ;
483496 std:: cmp:: min( new_size, $max_size)
484497 }
485498 } ;
0 commit comments