diff --git a/Cargo.lock b/Cargo.lock index 90ded9167..a403a153e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,6 +37,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + [[package]] name = "arrayvec" version = "0.7.2" @@ -188,6 +194,9 @@ name = "cc" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -910,6 +919,16 @@ dependencies = [ "vfs", ] +[[package]] +name = "fe-fuzzers" +version = "0.26.0" +dependencies = [ + "dir-test", + "fe-common", + "fe-driver", + "libfuzzer-sys", +] + [[package]] name = "fe-library" version = "0.26.0" @@ -1497,6 +1516,15 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.61" @@ -1543,6 +1571,17 @@ version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libm" version = "0.2.6" diff --git a/crates/fuzzers/Cargo.toml b/crates/fuzzers/Cargo.toml new file mode 100644 index 000000000..5d0ac0497 --- /dev/null +++ b/crates/fuzzers/Cargo.toml @@ -0,0 +1,18 @@ +[package] +authors = ["The Fe Developers "] +edition = "2021" +name = "fe-fuzzers" +version = "0.26.0" +license = "GPL-3.0-or-later" +repository = "https://github.com/ethereum/fe" + +[dependencies] +fe-common = {path = "../common", version = "^0.26.0"} +fe-driver = {path = "../driver", version = "^0.26.0"} +libfuzzer-sys = "0.4" + +dir-test = "^0.1" + +[lib] +name = "single_file_fuzzer" +path = "src/single_file_fuzzer.rs" diff --git a/crates/fuzzers/src/single_file_fuzzer.rs b/crates/fuzzers/src/single_file_fuzzer.rs new file mode 100644 index 000000000..aaa147b86 --- /dev/null +++ b/crates/fuzzers/src/single_file_fuzzer.rs @@ -0,0 +1,28 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use fe_common::diagnostics::print_diagnostics; + +fuzz_target!(|data: &[u8]| { + // Convert the fuzzing engine input to a string + let input = String::from_utf8_lossy(data); + + // Create a mutable database + let mut db = fe_driver::Db::default(); + + // Call the `compile_single_file` API with the input + let _ = match fe_driver::compile_single_file( + &mut db, + "dummy", + &input, + /*with_bytecode=*/ true, + /*with_runtime_bytecode=*/ true, + /*optimize=*/ true, + ) { + Ok(_) => (), + Err(error) => { + eprintln!("Unable to compile input."); + print_diagnostics(&db, &error.0); + } + }; +});