Coverage Report

Created: 2025-08-29 07:09

/src/quick-xml/fuzz/fuzz_targets/fuzz_target_1.rs
Line
Count
Source (jump to first uncovered line)
1
#![no_main]
2
use libfuzzer_sys::fuzz_target;
3
use std::hint::black_box;
4
5
use quick_xml::{events::Event, reader::Reader, writer::Writer};
6
use std::io::Cursor;
7
8
macro_rules! debug_format {
9
    ($x:expr) => {
10
        let _unused = std::hint::black_box(format!("{:?}", $x));
11
    };
12
}
13
14
11.2k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
11.2k
where
16
11.2k
    R: std::io::BufRead,
17
11.2k
{
18
11.2k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
11.2k
    let mut buf = vec![];
20
11.2k
    let config = reader.config_mut();
21
11.2k
    config.expand_empty_elements = true;
22
11.2k
    config.trim_text(true);
23
    loop {
24
3.96M
        let event_result = reader.read_event_into(&mut buf);
25
3.96M
        if let Ok(ref event) = event_result {
26
3.96M
            let _event = black_box(event.borrow());
27
3.96M
            let _event = black_box(event.as_ref());
28
3.96M
            debug_format!(event);
29
3.96M
            debug_format!(writer.write_event(event.borrow()));
30
3.96M
        }
31
3.96M
        match event_result {
32
3.14M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
3.14M
                debug_format!(e);
34
3.14M
                debug_format!(e.name());
35
3.14M
                for a in e.attributes() {
36
885k
                    debug_format!(a);
37
885k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>::{closure#0}
Line
Count
Source
37
248k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
fuzz_target_1::round_trip::<&[u8]>::{closure#0}
Line
Count
Source
37
146k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
6.60k
                        break;
39
879k
                    }
40
                }
41
            }
42
178k
            Ok(Event::Text(ref e))
43
1.48k
            | Ok(Event::Comment(ref e))
44
1.57k
            | Ok(Event::DocType(ref e)) => {
45
181k
                debug_format!(e);
46
181k
                if let Err(err) = e.decode() {
47
546
                    debug_format!(err);
48
546
                    break;
49
180k
                }
50
            }
51
62.7k
            Ok(Event::CData(e)) => {
52
62.7k
                if let Err(err) = e.escape() {
53
54
                    let _displayed = black_box(format!("{}", err));
54
54
                    debug_format!(err);
55
54
                    break;
56
62.7k
                }
57
            }
58
71.2k
            Ok(Event::GeneralRef(ref e)) => {
59
71.2k
                debug_format!(e);
60
71.2k
                debug_format!(e.is_char_ref());
61
71.2k
                debug_format!(e.resolve_char_ref());
62
71.2k
            }
63
3.53k
            Ok(Event::PI(ref e)) => {
64
3.53k
                debug_format!(e);
65
3.53k
            }
66
9.56k
            Ok(Event::Decl(ref e)) => {
67
9.56k
                debug_format!(e);
68
9.56k
                let _ = black_box(e.version());
69
9.56k
                let _ = black_box(e.encoding());
70
9.56k
                let _ = black_box(e.standalone());
71
9.56k
            }
72
477k
            Ok(Event::End(e)) => {
73
477k
                debug_format!(e.local_name());
74
477k
                let name = e.name();
75
477k
                debug_format!(name);
76
477k
                debug_format!(name.prefix());
77
477k
                debug_format!(name.local_name());
78
477k
                debug_format!(name.decompose());
79
477k
                debug_format!(name.as_namespace_binding());
80
477k
                debug_format!(e);
81
477k
            }
82
3.50k
            Err(e) => {
83
3.50k
                debug_format!(e);
84
3.50k
                break;
85
            }
86
7.18k
            Ok(Event::Eof) => break,
87
        }
88
3.95M
        buf.clear();
89
    }
90
11.2k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
11.2k
}
fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>
Line
Count
Source
14
6.88k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
6.88k
where
16
6.88k
    R: std::io::BufRead,
17
6.88k
{
18
6.88k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
6.88k
    let mut buf = vec![];
20
6.88k
    let config = reader.config_mut();
21
6.88k
    config.expand_empty_elements = true;
22
6.88k
    config.trim_text(true);
23
    loop {
24
2.88M
        let event_result = reader.read_event_into(&mut buf);
25
2.88M
        if let Ok(ref event) = event_result {
26
2.88M
            let _event = black_box(event.borrow());
27
2.88M
            let _event = black_box(event.as_ref());
28
2.88M
            debug_format!(event);
29
2.88M
            debug_format!(writer.write_event(event.borrow()));
30
2.88M
        }
31
2.88M
        match event_result {
32
2.34M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
2.34M
                debug_format!(e);
34
2.34M
                debug_format!(e.name());
35
2.34M
                for a in e.attributes() {
36
614k
                    debug_format!(a);
37
614k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
3.61k
                        break;
39
611k
                    }
40
                }
41
            }
42
108k
            Ok(Event::Text(ref e))
43
770
            | Ok(Event::Comment(ref e))
44
820
            | Ok(Event::DocType(ref e)) => {
45
109k
                debug_format!(e);
46
109k
                if let Err(err) = e.decode() {
47
546
                    debug_format!(err);
48
546
                    break;
49
109k
                }
50
            }
51
32.3k
            Ok(Event::CData(e)) => {
52
32.3k
                if let Err(err) = e.escape() {
53
54
                    let _displayed = black_box(format!("{}", err));
54
54
                    debug_format!(err);
55
54
                    break;
56
32.2k
                }
57
            }
58
42.7k
            Ok(Event::GeneralRef(ref e)) => {
59
42.7k
                debug_format!(e);
60
42.7k
                debug_format!(e.is_char_ref());
61
42.7k
                debug_format!(e.resolve_char_ref());
62
42.7k
            }
63
1.97k
            Ok(Event::PI(ref e)) => {
64
1.97k
                debug_format!(e);
65
1.97k
            }
66
6.22k
            Ok(Event::Decl(ref e)) => {
67
6.22k
                debug_format!(e);
68
6.22k
                let _ = black_box(e.version());
69
6.22k
                let _ = black_box(e.encoding());
70
6.22k
                let _ = black_box(e.standalone());
71
6.22k
            }
72
335k
            Ok(Event::End(e)) => {
73
335k
                debug_format!(e.local_name());
74
335k
                let name = e.name();
75
335k
                debug_format!(name);
76
335k
                debug_format!(name.prefix());
77
335k
                debug_format!(name.local_name());
78
335k
                debug_format!(name.decompose());
79
335k
                debug_format!(name.as_namespace_binding());
80
335k
                debug_format!(e);
81
335k
            }
82
2.11k
            Err(e) => {
83
2.11k
                debug_format!(e);
84
2.11k
                break;
85
            }
86
4.16k
            Ok(Event::Eof) => break,
87
        }
88
2.87M
        buf.clear();
89
    }
90
6.88k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
6.88k
}
fuzz_target_1::round_trip::<&[u8]>
Line
Count
Source
14
4.41k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
4.41k
where
16
4.41k
    R: std::io::BufRead,
17
4.41k
{
18
4.41k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
4.41k
    let mut buf = vec![];
20
4.41k
    let config = reader.config_mut();
21
4.41k
    config.expand_empty_elements = true;
22
4.41k
    config.trim_text(true);
23
    loop {
24
1.08M
        let event_result = reader.read_event_into(&mut buf);
25
1.08M
        if let Ok(ref event) = event_result {
26
1.08M
            let _event = black_box(event.borrow());
27
1.08M
            let _event = black_box(event.as_ref());
28
1.08M
            debug_format!(event);
29
1.08M
            debug_format!(writer.write_event(event.borrow()));
30
1.08M
        }
31
1.08M
        match event_result {
32
799k
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
799k
                debug_format!(e);
34
799k
                debug_format!(e.name());
35
799k
                for a in e.attributes() {
36
271k
                    debug_format!(a);
37
271k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
2.99k
                        break;
39
268k
                    }
40
                }
41
            }
42
70.1k
            Ok(Event::Text(ref e))
43
717
            | Ok(Event::Comment(ref e))
44
757
            | Ok(Event::DocType(ref e)) => {
45
71.6k
                debug_format!(e);
46
71.6k
                if let Err(err) = e.decode() {
47
0
                    debug_format!(err);
48
0
                    break;
49
71.6k
                }
50
            }
51
30.4k
            Ok(Event::CData(e)) => {
52
30.4k
                if let Err(err) = e.escape() {
53
0
                    let _displayed = black_box(format!("{}", err));
54
0
                    debug_format!(err);
55
0
                    break;
56
30.4k
                }
57
            }
58
28.5k
            Ok(Event::GeneralRef(ref e)) => {
59
28.5k
                debug_format!(e);
60
28.5k
                debug_format!(e.is_char_ref());
61
28.5k
                debug_format!(e.resolve_char_ref());
62
28.5k
            }
63
1.55k
            Ok(Event::PI(ref e)) => {
64
1.55k
                debug_format!(e);
65
1.55k
            }
66
3.33k
            Ok(Event::Decl(ref e)) => {
67
3.33k
                debug_format!(e);
68
3.33k
                let _ = black_box(e.version());
69
3.33k
                let _ = black_box(e.encoding());
70
3.33k
                let _ = black_box(e.standalone());
71
3.33k
            }
72
142k
            Ok(Event::End(e)) => {
73
142k
                debug_format!(e.local_name());
74
142k
                let name = e.name();
75
142k
                debug_format!(name);
76
142k
                debug_format!(name.prefix());
77
142k
                debug_format!(name.local_name());
78
142k
                debug_format!(name.decompose());
79
142k
                debug_format!(name.as_namespace_binding());
80
142k
                debug_format!(e);
81
142k
            }
82
1.38k
            Err(e) => {
83
1.38k
                debug_format!(e);
84
1.38k
                break;
85
            }
86
3.02k
            Ok(Event::Eof) => break,
87
        }
88
1.07M
        buf.clear();
89
    }
90
4.41k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
4.41k
}
92
93
fuzz_target!(|data: &[u8]| {
94
    // From reader
95
    let cursor = Cursor::new(data);
96
    let mut reader = Reader::from_reader(cursor);
97
    _ = std::hint::black_box(round_trip(&mut reader));
98
99
    // From str
100
    if let Ok(s) = std::str::from_utf8(data) {
101
        let mut reader = Reader::from_str(s);
102
        _ = std::hint::black_box(round_trip(&mut reader));
103
    }
104
});