Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions fuzz/fuzz_targets/validate-ensure-termination.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,10 @@ fuzz_target!(|m: Module| {
let mut m = m;
m.ensure_termination(100);
let bytes = m.to_bytes();
wasm_tools_fuzz::log_wasm(&bytes, ());

let mut validator = wasmparser::Validator::new();
validator.wasm_features(wasmparser::WasmFeatures {
multi_value: true,
..wasmparser::WasmFeatures::default()
});
if let Err(e) = validator.validate_all(&bytes) {
std::fs::write("test.wasm", bytes).unwrap();
panic!("Invalid module: {}", e);
}
});
27 changes: 17 additions & 10 deletions fuzz/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use libfuzzer_sys::arbitrary::{Result, Unstructured};
use std::fmt::Debug;
use wasm_smith::{ConfiguredModule, SwarmConfig};

pub fn generate_valid_module(input: &[u8]) -> Result<(Vec<u8>, SwarmConfig)> {
drop(env_logger::try_init());

let mut u = Unstructured::new(input);
let mut config: SwarmConfig = u.arbitrary()?;

Expand All @@ -18,19 +17,27 @@ pub fn generate_valid_module(input: &[u8]) -> Result<(Vec<u8>, SwarmConfig)> {
let module = ConfiguredModule::new(config.clone(), &mut u)?;
let bytes = module.to_bytes();

// Optionally log the module and its configuration if we've gotten this
// far. Note that we don't do this unconditionally to avoid slowing down
// fuzzing, but this is expected to be enabled when debugging a failing
// fuzzer.
log_wasm(&bytes, &config);

Ok((bytes, config))
}

// Optionally log the module and its configuration if we've gotten this
// far. Note that we don't do this unconditionally to avoid slowing down
// fuzzing, but this is expected to be enabled when debugging a failing
// fuzzer.
pub fn log_wasm(wasm: &[u8], config: impl Debug) {
drop(env_logger::try_init());

if log::log_enabled!(log::Level::Debug) {
log::debug!("writing test case to `test.wasm` ...");
std::fs::write("test.wasm", &bytes).unwrap();
std::fs::write("test.wasm", wasm).unwrap();
std::fs::write("test.config", format!("{:#?}", config)).unwrap();
if let Ok(wat) = wasmprinter::print_bytes(&bytes) {
if let Ok(wat) = wasmprinter::print_bytes(wasm) {
log::debug!("writing text format to `test.wat` ...");
std::fs::write("test.wat", wat).unwrap();
} else {
drop(std::fs::remove_file("test.wat"));
}
}

Ok((module.to_bytes(), config))
}