From 76a93dc112fda45d87465558840a231b1cb9c652 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Tue, 10 Aug 2021 12:03:21 -0700 Subject: [PATCH] fuzz: log Wasm contents to file when `log::debug` is enabled Previously, the WAT was printed as a log message. This change standardizes all of the oracles to use `log_wasm`, which emits a `.wasm` and `.wat` file for each case if `log::debug` is enabled and prints a message with the names of the created files. Closes #3140. --- crates/fuzzing/src/oracles.rs | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/crates/fuzzing/src/oracles.rs b/crates/fuzzing/src/oracles.rs index 8c84641fa7..76b5630b18 100644 --- a/crates/fuzzing/src/oracles.rs +++ b/crates/fuzzing/src/oracles.rs @@ -621,6 +621,7 @@ impl wasm_smith::Config for SingleFunctionModuleConfig { /// should be rare if modules are generated appropriately. pub fn differential_wasmi_execution(wasm: &[u8], config: &crate::generators::Config) -> Option<()> { crate::init_fuzzing(); + log_wasm(wasm); // Instantiate wasmi module and instance. let wasmi_module = wasmi::Module::from_buffer(&wasm[..]).ok()?; @@ -696,7 +697,6 @@ pub fn differential_wasmi_execution(wasm: &[u8], config: &crate::generators::Con (&Ok(None), &Ok(None)) => {} (&Err(_), &Err(_)) => {} _ => { - show_wat(wasm); panic!( "Values do not match: wasmi returned {:?}; wasmtime returned {:?}", wasmi_val, wasmtime_val @@ -705,7 +705,6 @@ pub fn differential_wasmi_execution(wasm: &[u8], config: &crate::generators::Con } if wasmi_mem.current_size().0 != wasmtime_mem.size(&wasmtime_store) as usize { - show_wat(wasm); panic!("resulting memories are not the same size"); } @@ -726,7 +725,6 @@ pub fn differential_wasmi_execution(wasm: &[u8], config: &crate::generators::Con } if &wasmi_buf[..] != &wasmtime_slice[..] { - show_wat(wasm); panic!("memory contents are not equal"); } @@ -739,8 +737,8 @@ pub fn differential_wasmi_execution(wasm: &[u8], config: &crate::generators::Con /// May return `None` if we early-out due to a rejected fuzz config. pub fn differential_spec_execution(wasm: &[u8], config: &crate::generators::Config) -> Option<()> { crate::init_fuzzing(); - debug!("WAT: {}", wasm2wat(wasm)); debug!("config: {:#?}", config); + log_wasm(wasm); // Run the spec interpreter first, then Wasmtime. The order is important // because both sides (OCaml runtime and Wasmtime) register signal handlers; @@ -778,7 +776,6 @@ pub fn differential_spec_execution(wasm: &[u8], config: &crate::generators::Conf .zip(wasmtime_vals) .all(|(s, w)| matches(s, w)); if !all_match { - show_wat(wasm); panic!( "Values do not match: spec returned {:?}; wasmtime returned {:?}", spec_vals, wasmtime_vals @@ -801,7 +798,6 @@ pub fn differential_spec_execution(wasm: &[u8], config: &crate::generators::Conf } // If only one side fails, fail the fuzz the test. _ => { - show_wat(wasm); panic!( "Only one side failed: spec returned {:?}; wasmtime returned {:?}", &spec_vals, &wasmtime_vals @@ -846,19 +842,6 @@ fn run_in_wasmtime( wasmtime_vals.map(|v| v.to_vec()) } -/// Print the Wasm as WAT on `stderr`. -fn show_wat(wasm: &[u8]) { - eprintln!("wat:\n{}\n", wasm2wat(wasm)); -} - -/// Convert the Wasm module to a `String`; an error -fn wasm2wat(wasm: &[u8]) -> String { - match wasmprinter::print_bytes(&wasm[..]) { - Ok(s) => s, - Err(e) => format!("wasm2wat failed: {}", e), - } -} - // Introspect wasmtime module to find the name of the first exported function. fn first_exported_function(module: &wasmtime::Module) -> Option { for e in module.exports() {