diff --git a/Cargo.toml b/Cargo.toml index 3693959..c1c6c32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["wasm"] +members = ["fuzz", "wasm"] diff --git a/fuzz/.gitignore b/fuzz/.gitignore new file mode 100644 index 0000000..b400c27 --- /dev/null +++ b/fuzz/.gitignore @@ -0,0 +1,2 @@ +corpus +artifacts diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 0000000..a79ce7a --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "fuzz" +version = "0.0.0" +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +wasm-smith = "0.8.0" + +[dependencies.parity-wasm] +git = "https://github.com/paritytech/parity-wasm.git" +features = ["multi_value", "sign_ext"] + +[dependencies.wasm] +path = "../wasm" + +[[bin]] +name = "translator" +path = "fuzz_targets/translator.rs" +test = false +doc = false diff --git a/fuzz/fuzz_targets/translator.rs b/fuzz/fuzz_targets/translator.rs new file mode 100644 index 0000000..732e790 --- /dev/null +++ b/fuzz/fuzz_targets/translator.rs @@ -0,0 +1,30 @@ +#![no_main] + +use std::io::Result; + +use parity_wasm::elements::Module as WasmModule; +use wasm_smith::Module as SmModule; + +use wasm::backend::{ + edition::{data::Edition, luajit::LuaJIT}, + translator::data::Module, +}; + +fn fuzz_translate(wasm: &WasmModule, ed: &dyn Edition) -> Result<()> { + let mut sink = std::io::sink(); + let module = Module::new(wasm); + + module.translate(ed, &mut sink) +} + +// We are not interested in parity_wasm errors. +// Only 1 edition should need to be tested too. +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_translate(&wasm, &LuaJIT).expect("LuaJIT should succeed"); +}); diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs new file mode 100644 index 0000000..fceb141 --- /dev/null +++ b/wasm/src/lib.rs @@ -0,0 +1 @@ +pub mod backend;