perf-event-data 0.1.8

Types and traits for parsing records emitted by perf_event_open
Documentation
use perf_event_data::endian::Native;
use perf_event_data::parse::{ParseConfig, Parser};
use perf_event_data::Visitor;
use perf_event_open_sys::bindings::perf_event_attr;

fn fuzz_test(data: &[u8]) {
    struct ParseVisitor;

    impl Visitor<'_> for ParseVisitor {
        type Output = ();

        fn visit_unimplemented<'a>(self, _: perf_event_data::RecordMetadata) {}
    }

    let attr_len = std::mem::size_of::<perf_event_attr>();
    if data.len() < attr_len {
        return;
    }

    let (head, rest) = data.split_at(attr_len);
    let mut attr = perf_event_attr::default();
    unsafe {
        std::ptr::copy_nonoverlapping(head.as_ptr(), &mut attr as *mut _ as *mut u8, attr_len);
    }

    let config = ParseConfig::<Native>::from(attr);
    let mut parser = Parser::new(rest, config);

    let _ = parser.parse_record(ParseVisitor);
}

#[test]
fn fuzz_test_1() {
    let data = [
        224, 115, 115, 93, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
        115, 115, 115, 115, 115, 59, 115, 115, 115, 115, 115, 115, 115, 115, 130, 115, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 197, 197, 197, 197, 197, 197, 255, 255, 255, 255, 38, 255, 255, 255, 255,
        224, 115, 115, 93, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
        115, 115, 255, 255, 255, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
        115, 115, 115, 115, 255, 255, 255, 255, 255, 255, 255, 255, 115, 115, 115,
    ];
    fuzz_test(&data);
}