Files
gentoo-utils-gitea/fuzz/atom/parser/fuzz.rs
John Turner b0f68fa7e0 remove static variables from atom parser fuzzer
Stdin and Stdout are already synchronized and available to multiple
threads as needed, we don't need to hold onto instances in a static variable.
2025-12-15 00:33:35 +00:00

60 lines
1.7 KiB
Rust

#![deny(unused_imports)]
#![allow(clippy::missing_safety_doc)]
use core::slice;
use gentoo_utils::{Parseable, atom::Atom};
use std::io::{self, Write};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn LLVMFuzzerTestOneInput(input: *const u8, len: usize) -> i32 {
let slice = unsafe { slice::from_raw_parts(input, len) };
let str = str::from_utf8(slice).expect("expected ascii input");
if str.chars().any(|c| !c.is_ascii_graphic()) {
return -1;
}
let stdin = io::stdin();
let mut stdout = io::stdout();
let mut buffer = String::new();
writeln!(&mut stdout, "{str}").unwrap();
stdin.read_line(&mut buffer).unwrap();
let control = match buffer.as_str().trim() {
"0" => Ok(()),
"1" => Err(()),
other => panic!("unexpected input from pipes: {other}"),
};
let gentoo_utils = Atom::parse(str);
match (control, gentoo_utils) {
(Ok(_), Ok(_)) => {
eprintln!("agreement that {str} is valid");
}
(Err(_), Err(_)) => {
eprintln!("agreement that {str} is invalid");
}
(Ok(_), Err(rest)) => {
panic!("disagreement on {str}\ncontrol:Ok\ngentoo-utils:Err({rest})");
}
(Err(_), Ok(atom))
if atom
.usedeps()
.iter()
.any(|usedep| atom.usedeps().iter().filter(|u| usedep == *u).count() > 1) =>
{
eprintln!(
"disagreement, but we will allow it since its probably because of duplicated usdeps"
);
}
(Err(_), Ok(_)) => {
panic!("disagreement on {str}\ncontrol:Err\ngentoo-utils:Ok")
}
}
0
}