diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index a79ce7a..5c50b61 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -19,7 +19,19 @@ features = ["multi_value", "sign_ext"] path = "../wasm" [[bin]] -name = "translator" -path = "fuzz_targets/translator.rs" +name = "full_translate" +path = "fuzz_targets/full_translate.rs" +test = false +doc = false + +[[bin]] +name = "just_writer" +path = "fuzz_targets/just_writer.rs" +test = false +doc = false + +[[bin]] +name = "just_transformer" +path = "fuzz_targets/just_transformer.rs" test = false doc = false diff --git a/fuzz/fuzz_targets/translator.rs b/fuzz/fuzz_targets/full_translate.rs similarity index 100% rename from fuzz/fuzz_targets/translator.rs rename to fuzz/fuzz_targets/full_translate.rs diff --git a/fuzz/fuzz_targets/just_transformer.rs b/fuzz/fuzz_targets/just_transformer.rs new file mode 100644 index 0000000..b036ef1 --- /dev/null +++ b/fuzz/fuzz_targets/just_transformer.rs @@ -0,0 +1,24 @@ +#![no_main] + +use parity_wasm::elements::Module as WasmModule; +use wasm_smith::Module as SmModule; + +use wasm::backend::{ast::transformer::Transformer, translator::arity::List}; + +fn fuzz_transformer(wasm: &WasmModule) { + let arity = List::new(wasm); + + for i in 0..arity.in_arity.len() { + let _ = Transformer::new(wasm, &arity).consume(i); + } +} + +libfuzzer_sys::fuzz_target!(|module: SmModule| { + let data = module.to_bytes(); + let wasm = match parity_wasm::deserialize_buffer(&data) { + Ok(v) => v, + Err(_) => return, + }; + + fuzz_transformer(&wasm); +}); diff --git a/fuzz/fuzz_targets/just_writer.rs b/fuzz/fuzz_targets/just_writer.rs new file mode 100644 index 0000000..d5e85c3 --- /dev/null +++ b/fuzz/fuzz_targets/just_writer.rs @@ -0,0 +1,35 @@ +#![no_main] + +use std::io::Result; + +use parity_wasm::elements::Module as WasmModule; +use wasm_smith::Module as SmModule; + +use wasm::backend::{ + ast::transformer::Transformer, + edition::{data::Edition, luajit::LuaJIT}, + translator::{arity::List, writer::Data}, +}; + +fn fuzz_writer(wasm: &WasmModule, ed: &dyn Edition) -> Result<()> { + let mut sink = std::io::sink(); + let arity = List::new(wasm); + + for i in 0..arity.in_arity.len() { + let func = Transformer::new(wasm, &arity).consume(i); + + func.output(&mut Data::new(ed), &mut sink)?; + } + + Ok(()) +} + +libfuzzer_sys::fuzz_target!(|module: SmModule| { + let data = module.to_bytes(); + let wasm = match parity_wasm::deserialize_buffer(&data) { + Ok(v) => v, + Err(_) => return, + }; + + fuzz_writer(&wasm, &LuaJIT).expect("LuaJIT should succeed"); +}); diff --git a/wasm/src/backend/mod.rs b/wasm/src/backend/mod.rs index 3bb5960..89340ed 100644 --- a/wasm/src/backend/mod.rs +++ b/wasm/src/backend/mod.rs @@ -1,4 +1,4 @@ -mod ast; +pub mod ast; pub mod edition; pub mod translator; mod visitor; diff --git a/wasm/src/backend/translator/mod.rs b/wasm/src/backend/translator/mod.rs index 93ac500..297d79a 100644 --- a/wasm/src/backend/translator/mod.rs +++ b/wasm/src/backend/translator/mod.rs @@ -1,3 +1,3 @@ pub mod arity; pub mod data; -mod writer; +pub mod writer;