Coverage Report

Created: 2024-10-16 07:58

/src/wasmer/fuzz/fuzz_targets/deterministic.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::{CompilerConfig, EngineBuilder, Module, Store};
6
use wasmer_compiler::Engine;
7
use wasmer_compiler_cranelift::Cranelift;
8
use wasmer_compiler_llvm::LLVM;
9
use wasmer_compiler_singlepass::Singlepass;
10
11
0
#[derive(Arbitrary, Debug, Default, Copy, Clone)]
<deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#1}
Line
Count
Source
11
5.00k
#[derive(Arbitrary, Debug, Default, Copy, Clone)]
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#0}
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary::{closure#2}
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#1}
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#0}
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::arbitrary_take_rest::{closure#2}
Unexecuted instantiation: <deterministic::NoImportsConfig as arbitrary::Arbitrary>::size_hint::{closure#0}
12
struct NoImportsConfig;
13
impl Config for NoImportsConfig {
14
5.00k
    fn max_imports(&self) -> usize {
15
5.00k
        0
16
5.00k
    }
17
2.50k
    fn max_memory_pages(&self) -> u32 {
18
2.50k
        // https://github.com/wasmerio/wasmer/issues/2187
19
2.50k
        65535
20
2.50k
    }
21
5.00k
    fn allow_start_export(&self) -> bool {
22
5.00k
        false
23
5.00k
    }
24
}
25
26
15.0k
fn compile_and_compare(name: &str, engine: Engine, wasm: &[u8]) {
27
15.0k
    let store = Store::new(engine);
28
15.0k
29
15.0k
    // compile for first time
30
15.0k
    let module = Module::new(&store, wasm).unwrap();
31
15.0k
    let first = module.serialize().unwrap();
32
15.0k
33
15.0k
    // compile for second time
34
15.0k
    let module = Module::new(&store, wasm).unwrap();
35
15.0k
    let second = module.serialize().unwrap();
36
15.0k
37
15.0k
    if first != second {
38
0
        panic!("non-deterministic compilation from {}", name);
39
15.0k
    }
40
15.0k
}
41
42
fuzz_target!(|module: ConfiguredModule<NoImportsConfig>| {
43
    let wasm_bytes = module.to_bytes();
44
45
    let mut compiler = Cranelift::default();
46
    compiler.canonicalize_nans(true);
47
    compiler.enable_verifier();
48
    compile_and_compare(
49
        "universal-cranelift",
50
        EngineBuilder::new(compiler.clone()).engine(),
51
        &wasm_bytes,
52
    );
53
54
    let mut compiler = LLVM::default();
55
    compiler.canonicalize_nans(true);
56
    compiler.enable_verifier();
57
    compile_and_compare(
58
        "universal-llvm",
59
        EngineBuilder::new(compiler.clone()).engine(),
60
        &wasm_bytes,
61
    );
62
63
    let compiler = Singlepass::default();
64
    compile_and_compare(
65
        "universal-singlepass",
66
        EngineBuilder::new(compiler.clone()).engine(),
67
        &wasm_bytes,
68
    );
69
});