Add fuzzer for the encoder

This commit is contained in:
Ivan Smirnov 2021-11-30 16:21:03 +00:00
parent dd2ed70e70
commit 0701c95f3d
3 changed files with 57 additions and 0 deletions

3
fuzz/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
target
corpus
artifacts

25
fuzz/Cargo.toml Normal file
View file

@ -0,0 +1,25 @@
[package]
name = "qoi-fast-fuzz"
version = "0.1.0"
authors = ["Ivan Smirnov <rust@ivan.smirnov.ie>"]
publish = false
edition = "2021"
[package.metadata]
cargo-fuzz = true
[dependencies]
# internal
qoi-fast = { path = ".." }
# external
libfuzzer-sys = "0.4"
# Prevent this from interfering with workspaces
[workspace]
members = ["."]
[[bin]]
name = "qoi_encode"
path = "fuzz_targets/qoi_encode.rs"
test = false
doc = false

View file

@ -0,0 +1,29 @@
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|input: (bool, u8, &[u8])| {
let (is_4, w_frac, data) = input;
let channels = if is_4 { 4 } else { 3 };
let size = data.len();
let n_pixels = size / channels as usize;
let (w, h) = if n_pixels == 0 {
(0, 0)
} else {
let w = ((n_pixels * (1 + w_frac as usize)) / 256).max(1);
let h = n_pixels / w;
(w, h)
};
let out = qoi_fast::qoi_encode_to_vec(
&data[..(w * h * channels as usize)],
w as u32,
h as u32,
channels,
0,
);
if w * h != 0 {
let out = out.unwrap();
assert!(out.len() <= qoi_fast::encode_size_required(w as u32, h as u32, channels));
} else {
assert!(out.is_err());
}
});