diff --git a/fuzz/fuzz_targets/fuzz_common.rs b/fuzz/fuzz_targets/fuzz_common.rs index 0fe2306e751..2adbb3dd677 100644 --- a/fuzz/fuzz_targets/fuzz_common.rs +++ b/fuzz/fuzz_targets/fuzz_common.rs @@ -4,6 +4,8 @@ // file that was distributed with this source code. use libc::{close, dup, dup2, pipe, STDERR_FILENO, STDOUT_FILENO}; +use rand::prelude::SliceRandom; +use rand::Rng; use std::ffi::OsString; use std::io; use std::io::Write; @@ -272,3 +274,26 @@ pub fn compare_result( } } } + +pub fn generate_random_string(max_length: usize) -> String { + let mut rng = rand::thread_rng(); + let valid_utf8: Vec = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + .chars() + .collect(); + let invalid_utf8 = [0xC3, 0x28]; // Invalid UTF-8 sequence + let mut result = String::new(); + + for _ in 0..rng.gen_range(1..=max_length) { + if rng.gen_bool(0.9) { + let ch = valid_utf8.choose(&mut rng).unwrap(); + result.push(*ch); + } else { + let ch = invalid_utf8.choose(&mut rng).unwrap(); + if let Some(c) = char::from_u32(*ch as u32) { + result.push(c); + } + } + } + + result +} diff --git a/fuzz/fuzz_targets/fuzz_expr.rs b/fuzz/fuzz_targets/fuzz_expr.rs index 90daa107fc8..8d1848545ff 100644 --- a/fuzz/fuzz_targets/fuzz_expr.rs +++ b/fuzz/fuzz_targets/fuzz_expr.rs @@ -14,32 +14,11 @@ use std::{env, ffi::OsString}; mod fuzz_common; use crate::fuzz_common::CommandResult; -use crate::fuzz_common::{compare_result, generate_and_run_uumain, run_gnu_cmd}; +use crate::fuzz_common::{ + compare_result, generate_and_run_uumain, generate_random_string, run_gnu_cmd, +}; static CMD_PATH: &str = "expr"; -fn generate_random_string(max_length: usize) -> String { - let mut rng = rand::thread_rng(); - let valid_utf8: Vec = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - .chars() - .collect(); - let invalid_utf8 = [0xC3, 0x28]; // Invalid UTF-8 sequence - let mut result = String::new(); - - for _ in 0..rng.gen_range(1..=max_length) { - if rng.gen_bool(0.9) { - let ch = valid_utf8.choose(&mut rng).unwrap(); - result.push(*ch); - } else { - let ch = invalid_utf8.choose(&mut rng).unwrap(); - if let Some(c) = char::from_u32(*ch as u32) { - result.push(c); - } - } - } - - result -} - fn generate_expr(max_depth: u32) -> String { let mut rng = rand::thread_rng(); let ops = ["+", "-", "*", "/", "%", "<", ">", "=", "&", "|"]; diff --git a/fuzz/fuzz_targets/fuzz_test.rs b/fuzz/fuzz_targets/fuzz_test.rs index 0f2328c55db..38cd691b389 100644 --- a/fuzz/fuzz_targets/fuzz_test.rs +++ b/fuzz/fuzz_targets/fuzz_test.rs @@ -14,7 +14,9 @@ use std::ffi::OsString; mod fuzz_common; use crate::fuzz_common::CommandResult; -use crate::fuzz_common::{compare_result, generate_and_run_uumain, run_gnu_cmd}; +use crate::fuzz_common::{ + compare_result, generate_and_run_uumain, generate_random_string, run_gnu_cmd, +}; #[derive(PartialEq, Debug, Clone)] enum ArgType { @@ -29,29 +31,6 @@ enum ArgType { static CMD_PATH: &str = "test"; -fn generate_random_string(max_length: usize) -> String { - let mut rng = rand::thread_rng(); - let valid_utf8: Vec = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - .chars() - .collect(); - let invalid_utf8 = [0xC3, 0x28]; // Invalid UTF-8 sequence - let mut result = String::new(); - - for _ in 0..rng.gen_range(1..=max_length) { - if rng.gen_bool(0.9) { - let ch = valid_utf8.choose(&mut rng).unwrap(); - result.push(*ch); - } else { - let ch = invalid_utf8.choose(&mut rng).unwrap(); - if let Some(c) = char::from_u32(*ch as u32) { - result.push(c); - } - } - } - - result -} - #[derive(Debug, Clone)] struct TestArg { arg: String,