Skip to content

Commit b3f9e4f

Browse files
committed
Mark auto-generated rust_fuzzer_custom_mutator function as unsafe
Fixes #113
1 parent c9c43f3 commit b3f9e4f

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/lib.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)