Skip to content

Commit d102d74

Browse files
committed
add fuzzer
1 parent f264510 commit d102d74

6 files changed

Lines changed: 587 additions & 0 deletions

File tree

fuzz/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
target
2+
corpus
3+
artifacts
4+
coverage

fuzz/Cargo.lock

Lines changed: 196 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fuzz/Cargo.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[package]
2+
name = "roaring-fuzz"
3+
version = "0.0.0"
4+
publish = false
5+
edition = "2021"
6+
7+
[package.metadata]
8+
cargo-fuzz = true
9+
10+
[dependencies]
11+
libfuzzer-sys = { version = "0.4.9", features = ["arbitrary-derive"] }
12+
roaring = { path = "../roaring" }
13+
croaring = "2.0"
14+
15+
[[bin]]
16+
name = "against_croaring"
17+
path = "fuzz_targets/against_croaring.rs"
18+
test = false
19+
doc = false
20+
bench = false
21+
22+
[workspace]
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#![no_main]
2+
3+
mod arbitrary_ops;
4+
5+
use libfuzzer_sys::arbitrary::{self, Arbitrary};
6+
use libfuzzer_sys::fuzz_target;
7+
8+
use crate::arbitrary_ops::{check_equal, Operation};
9+
10+
#[derive(Arbitrary, Debug)]
11+
struct FuzzInput<'a> {
12+
ops: Vec<Operation>,
13+
initial_input: &'a [u8],
14+
}
15+
16+
fuzz_target!(|input: FuzzInput| {
17+
let lhs_c = croaring::Bitmap::try_deserialize::<croaring::Portable>(input.initial_input);
18+
let lhs_r = roaring::RoaringBitmap::deserialize_from(input.initial_input).ok();
19+
20+
let (mut lhs_c, mut lhs_r) = match (lhs_c, lhs_r) {
21+
(Some(lhs_c), Some(lhs_r)) => {
22+
check_equal(&lhs_c, &lhs_r);
23+
(lhs_c, lhs_r)
24+
}
25+
(None, None) => Default::default(),
26+
(Some(_), None) => panic!("croaring deserialized, but roaring failed"),
27+
(None, Some(_)) => panic!("roaring deserialized, but croaring failed"),
28+
};
29+
30+
let mut rhs_c = croaring::Bitmap::new();
31+
let mut rhs_r = roaring::RoaringBitmap::new();
32+
33+
for op in input.ops {
34+
op.apply(&mut lhs_c, &mut rhs_c, &mut lhs_r, &mut rhs_r);
35+
}
36+
check_equal(&lhs_c, &lhs_r);
37+
check_equal(&rhs_c, &rhs_r);
38+
});

0 commit comments

Comments
 (0)