Coverage Report

Created: 2024-10-16 07:58

/src/wasmer/fuzz/fuzz_targets/universal_singlepass.rs
Line
Count
Source (jump to first uncovered line)
1
#![no_main]
2
3
use libfuzzer_sys::{arbitrary, arbitrary::Arbitrary, fuzz_target};
4
use wasm_smith::{Config, ConfiguredModule};
5
use wasmer::{imports, Instance, Module, Store};
6
use wasmer_compiler_singlepass::Singlepass;
7
8
0
#[derive(Arbitrary, Debug, Default, Copy, Clone)]
<universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#1}
Line
Count
Source
8
12.6k
#[derive(Arbitrary, Debug, Default, Copy, Clone)]
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#0}
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#2}
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#1}
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#0}
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#2}
Unexecuted instantiation: <universal_singlepass::NoImportsConfig as arbitrary::Arbitrary>::size_hint::{closure#0}
9
struct NoImportsConfig;
10
impl Config for NoImportsConfig {
11
12.6k
    fn max_imports(&self) -> usize {
12
12.6k
        0
13
12.6k
    }
14
4.39k
    fn max_memory_pages(&self) -> u32 {
15
4.39k
        // https://github.com/wasmerio/wasmer/issues/2187
16
4.39k
        65535
17
4.39k
    }
18
12.6k
    fn allow_start_export(&self) -> bool {
19
12.6k
        false
20
12.6k
    }
21
}
22
12.6k
#[derive(Arbitrary)]
Unexecuted instantiation: <universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary::{closure#0}
Unexecuted instantiation: <universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary::{closure#1}
Unexecuted instantiation: <universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary::{closure#2}
Unexecuted instantiation: <universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#0}
<universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#1}
Line
Count
Source
22
12.6k
#[derive(Arbitrary)]
Unexecuted instantiation: <universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#2}
<universal_singlepass::WasmSmithModule as arbitrary::Arbitrary>::size_hint::{closure#0}
Line
Count
Source
22
12.6k
#[derive(Arbitrary)]
23
struct WasmSmithModule(ConfiguredModule<NoImportsConfig>);
24
impl std::fmt::Debug for WasmSmithModule {
25
0
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26
0
        f.write_str(&wasmprinter::print_bytes(self.0.to_bytes()).unwrap())
27
0
    }
28
}
29
30
fuzz_target!(|module: WasmSmithModule| {
31
    let wasm_bytes = module.0.to_bytes();
32
33
    if let Ok(path) = std::env::var("DUMP_TESTCASE") {
34
        use std::fs::File;
35
        use std::io::Write;
36
        let mut file = File::create(path).unwrap();
37
        file.write_all(&wasm_bytes).unwrap();
38
        return;
39
    }
40
41
    let compiler = Singlepass::default();
42
    let mut store = Store::new(compiler);
43
    let module = Module::new(&store, &wasm_bytes);
44
    let module = match module {
45
        Ok(m) => m,
46
        Err(e) => {
47
            let error_message = format!("{}", e);
48
            if error_message.contains("Validation error: invalid result arity: func type returns multiple values") || error_message.contains("Validation error: blocks, loops, and ifs may only produce a resulttype when multi-value is not enabled") || error_message.contains("multi-value returns not yet implemented") {
49
                return;
50
            }
51
            panic!("{}", e);
52
        }
53
    };
54
    match Instance::new(&mut store, &module, &imports! {}) {
55
        Ok(_) => {}
56
        Err(e) => {
57
            let error_message = format!("{}", e);
58
            if error_message.starts_with("RuntimeError: ")
59
                && error_message.contains("out of bounds")
60
            {
61
                return;
62
            }
63
            panic!("{}", e);
64
        }
65
    }
66
});