@@ -459,9 +459,11 @@ macro_rules! fuzz_mutator {
459
459
|
460
460
$body: block
461
461
) => {
462
- /// Auto-generated function.
462
+ /// Auto-generated function. Do not use; only for LibFuzzer's
463
+ /// consumption.
463
464
#[ export_name = "LLVMFuzzerCustomMutator" ]
464
- pub fn rust_fuzzer_custom_mutator(
465
+ #[ doc( hidden) ]
466
+ pub unsafe fn rust_fuzzer_custom_mutator(
465
467
$data: * mut u8 ,
466
468
$size: usize ,
467
469
$max_size: usize ,
@@ -471,15 +473,26 @@ macro_rules! fuzz_mutator {
471
473
// might be larger or smaller than `max_size`. The `data`'s capacity
472
474
// is the maximum of the two.
473
475
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) ;
475
477
476
478
// `unsigned int` is generally a `u32`, but not on all targets. Do
477
479
// an infallible (and potentially lossy, but that's okay because it
478
480
// preserves determinism) conversion.
479
481
let $seed = $seed as u32 ;
480
482
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
+
481
495
// Truncate the new size if it is larger than the max.
482
- let new_size = { $body } ;
483
496
std:: cmp:: min( new_size, $max_size)
484
497
}
485
498
} ;
0 commit comments