diff --git a/fuzz/fuzz_targets/fuzz_test.rs b/fuzz/fuzz_targets/fuzz_test.rs index ff544ca2a99..c627a673c03 100644 --- a/fuzz/fuzz_targets/fuzz_test.rs +++ b/fuzz/fuzz_targets/fuzz_test.rs @@ -51,57 +51,128 @@ struct TestArg { arg_type: String, } -fn generate_test_arg() -> String { - let mut rng = rand::thread_rng(); - let test_args = vec![ +fn generate_random_path(rng: &mut dyn rand::RngCore) -> &'static str { + match rng.gen_range(0..=3) { + 0 => "/dev/null", + 1 => "/dev/random", + 2 => "/tmp", + _ => "/dev/urandom", + } +} + +fn generate_test_args() -> Vec { + vec![ TestArg { arg: "-z".to_string(), arg_type: "STRING".to_string(), }, + TestArg { + arg: "-n".to_string(), + arg_type: "STRING".to_string(), + }, TestArg { arg: "=".to_string(), - arg_type: "STRING1,STRING2".to_string(), + arg_type: "STRING,STRING".to_string(), + }, + TestArg { + arg: "!=".to_string(), + arg_type: "STRING,STRING".to_string(), + }, + TestArg { + arg: "-eq".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-ne".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-gt".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-ge".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-lt".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-le".to_string(), + arg_type: "INTEGER,INTEGER".to_string(), + }, + TestArg { + arg: "-f".to_string(), + arg_type: "FILE".to_string(), }, - // Add more TestArg structs for all possible arguments - ]; + TestArg { + arg: "-d".to_string(), + arg_type: "FILE".to_string(), + }, + TestArg { + arg: "-e".to_string(), + arg_type: "FILE".to_string(), + }, + TestArg { + arg: "-ef".to_string(), + arg_type: "FILE,FILE".to_string(), + }, + TestArg { + arg: "-nt".to_string(), + arg_type: "FILE,FILE".to_string(), + }, + ] +} +fn generate_test_arg() -> String { + let mut rng = rand::thread_rng(); + let test_args = generate_test_args(); let mut arg = String::new(); - let choice = rng.gen_range(0..=3); + let choice = rng.gen_range(0..=5); match choice { 0 => { arg.push_str(&rng.gen_range(-100..=100).to_string()); } - 1 => { + 1 | 2 | 3 => { let test_arg = test_args .choose(&mut rng) .expect("Failed to choose a random test argument"); - arg.push_str(&test_arg.arg); if test_arg.arg_type.contains("INTEGER") { - arg.push_str(&rng.gen_range(-100..=100).to_string()); - arg.push_str(&test_arg.arg); - arg.push_str(&rng.gen_range(-100..=100).to_string()); + arg.push_str(&format!( + "{} {} {}", + &rng.gen_range(-100..=100).to_string(), + test_arg.arg, + &rng.gen_range(-100..=100).to_string() + )); + } else if test_arg.arg_type.contains("STRING,STRING") { + let random_str = generate_random_string(rng.gen_range(1..=10)); + let random_str2 = generate_random_string(rng.gen_range(1..=10)); + + arg.push_str(&format!( + "{} {} {}", + &random_str, test_arg.arg, &random_str2 + )); } else if test_arg.arg_type.contains("STRING") { let random_str = generate_random_string(rng.gen_range(1..=10)); - arg.push_str(&random_str); + arg.push_str(&format!("{} {}", test_arg.arg, &random_str)); + } else if test_arg.arg_type.contains("FILE,FILE") { + let path = generate_random_path(&mut rng); + let path2 = generate_random_path(&mut rng); + arg.push_str(&format!("{} {} {}", path, test_arg.arg, path2)); } else if test_arg.arg_type.contains("FILE") { - let choice = rng.gen_range(0..=2); - let path = match choice { - 0 => "/dev/null", - 1 => "/dev/random", - _ => "/dev/urandom", - }; - arg.push_str(&format!("{}{}", test_arg.arg, path)); + let path = generate_random_path(&mut rng); + arg.push_str(&format!("{} {}", test_arg.arg, path)); } } - 2 => { + 4 => { let random_str = generate_random_string(rng.gen_range(1..=10)); arg.push_str(&random_str); } _ => { - let choice = rng.gen_range(0..=2); - let path = match choice { + let path = match rng.gen_range(0..=2) { 0 => "/dev/null", 1 => "/dev/random", _ => "/dev/urandom", @@ -192,6 +263,7 @@ fuzz_target!(|_data: &[u8]| { println!("GNU output: {}", gnu_output); println!("My exit status: {}", uumain_exit_status); println!("GNU exit status: {}", gnu_exit_status); + panic!(); } else { println!( "Outputs and exit statuses matched for expression {:?}",