|
| 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