Coverage Report

Created: 2025-07-11 06:36

/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
10.3k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
10.3k
where
16
10.3k
    R: std::io::BufRead,
17
10.3k
{
18
10.3k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
10.3k
    let mut buf = vec![];
20
10.3k
    let config = reader.config_mut();
21
10.3k
    config.expand_empty_elements = true;
22
10.3k
    config.trim_text(true);
23
    loop {
24
4.19M
        let event_result = reader.read_event_into(&mut buf);
25
4.19M
        if let Ok(ref event) = event_result {
26
4.18M
            let _event = black_box(event.borrow());
27
4.18M
            let _event = black_box(event.as_ref());
28
4.18M
            debug_format!(event);
29
4.18M
            debug_format!(writer.write_event(event.borrow()));
30
4.18M
        }
31
4.18M
        match event_result {
32
3.11M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
3.11M
                debug_format!(e);
34
3.11M
                debug_format!(e.name());
35
3.11M
                for a in e.attributes() {
36
540k
                    debug_format!(a);
37
540k
                    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
157k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
fuzz_target_1::round_trip::<&[u8]>::{closure#0}
Line
Count
Source
37
68.6k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
9.39k
                        break;
39
530k
                    }
40
                }
41
            }
42
321k
            Ok(Event::Text(ref e))
43
1.80k
            | Ok(Event::Comment(ref e))
44
1.58k
            | Ok(Event::DocType(ref e)) => {
45
325k
                debug_format!(e);
46
325k
                if let Err(err) = e.decode() {
47
505
                    debug_format!(err);
48
505
                    break;
49
324k
                }
50
            }
51
100k
            Ok(Event::CData(e)) => {
52
100k
                if let Err(err) = e.escape() {
53
45
                    let _displayed = black_box(format!("{}", err));
54
45
                    debug_format!(err);
55
45
                    break;
56
100k
                }
57
            }
58
168k
            Ok(Event::GeneralRef(ref e)) => {
59
168k
                debug_format!(e);
60
168k
                debug_format!(e.is_char_ref());
61
168k
                debug_format!(e.resolve_char_ref());
62
168k
            }
63
5.06k
            Ok(Event::PI(ref e)) => {
64
5.06k
                debug_format!(e);
65
5.06k
            }
66
6.61k
            Ok(Event::Decl(ref e)) => {
67
6.61k
                debug_format!(e);
68
6.61k
                let _ = black_box(e.version());
69
6.61k
                let _ = black_box(e.encoding());
70
6.61k
                let _ = black_box(e.standalone());
71
6.61k
            }
72
457k
            Ok(Event::End(e)) => {
73
457k
                debug_format!(e.local_name());
74
457k
                let name = e.name();
75
457k
                debug_format!(name);
76
457k
                debug_format!(name.prefix());
77
457k
                debug_format!(name.local_name());
78
457k
                debug_format!(name.decompose());
79
457k
                debug_format!(name.as_namespace_binding());
80
457k
                debug_format!(e);
81
457k
            }
82
3.42k
            Err(e) => {
83
3.42k
                debug_format!(e);
84
3.42k
                break;
85
            }
86
6.38k
            Ok(Event::Eof) => break,
87
        }
88
4.18M
        buf.clear();
89
    }
90
10.3k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
10.3k
}
fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>
Line
Count
Source
14
6.35k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
6.35k
where
16
6.35k
    R: std::io::BufRead,
17
6.35k
{
18
6.35k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
6.35k
    let mut buf = vec![];
20
6.35k
    let config = reader.config_mut();
21
6.35k
    config.expand_empty_elements = true;
22
6.35k
    config.trim_text(true);
23
    loop {
24
2.99M
        let event_result = reader.read_event_into(&mut buf);
25
2.99M
        if let Ok(ref event) = event_result {
26
2.99M
            let _event = black_box(event.borrow());
27
2.99M
            let _event = black_box(event.as_ref());
28
2.99M
            debug_format!(event);
29
2.99M
            debug_format!(writer.write_event(event.borrow()));
30
2.99M
        }
31
2.99M
        match event_result {
32
2.26M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
2.26M
                debug_format!(e);
34
2.26M
                debug_format!(e.name());
35
2.26M
                for a in e.attributes() {
36
399k
                    debug_format!(a);
37
399k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
5.04k
                        break;
39
394k
                    }
40
                }
41
            }
42
211k
            Ok(Event::Text(ref e))
43
975
            | Ok(Event::Comment(ref e))
44
818
            | Ok(Event::DocType(ref e)) => {
45
213k
                debug_format!(e);
46
213k
                if let Err(err) = e.decode() {
47
505
                    debug_format!(err);
48
505
                    break;
49
212k
                }
50
            }
51
53.4k
            Ok(Event::CData(e)) => {
52
53.4k
                if let Err(err) = e.escape() {
53
45
                    let _displayed = black_box(format!("{}", err));
54
45
                    debug_format!(err);
55
45
                    break;
56
53.4k
                }
57
            }
58
92.9k
            Ok(Event::GeneralRef(ref e)) => {
59
92.9k
                debug_format!(e);
60
92.9k
                debug_format!(e.is_char_ref());
61
92.9k
                debug_format!(e.resolve_char_ref());
62
92.9k
            }
63
3.12k
            Ok(Event::PI(ref e)) => {
64
3.12k
                debug_format!(e);
65
3.12k
            }
66
3.72k
            Ok(Event::Decl(ref e)) => {
67
3.72k
                debug_format!(e);
68
3.72k
                let _ = black_box(e.version());
69
3.72k
                let _ = black_box(e.encoding());
70
3.72k
                let _ = black_box(e.standalone());
71
3.72k
            }
72
357k
            Ok(Event::End(e)) => {
73
357k
                debug_format!(e.local_name());
74
357k
                let name = e.name();
75
357k
                debug_format!(name);
76
357k
                debug_format!(name.prefix());
77
357k
                debug_format!(name.local_name());
78
357k
                debug_format!(name.decompose());
79
357k
                debug_format!(name.as_namespace_binding());
80
357k
                debug_format!(e);
81
357k
            }
82
2.08k
            Err(e) => {
83
2.08k
                debug_format!(e);
84
2.08k
                break;
85
            }
86
3.72k
            Ok(Event::Eof) => break,
87
        }
88
2.98M
        buf.clear();
89
    }
90
6.35k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
6.35k
}
fuzz_target_1::round_trip::<&[u8]>
Line
Count
Source
14
4.00k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
4.00k
where
16
4.00k
    R: std::io::BufRead,
17
4.00k
{
18
4.00k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
19
4.00k
    let mut buf = vec![];
20
4.00k
    let config = reader.config_mut();
21
4.00k
    config.expand_empty_elements = true;
22
4.00k
    config.trim_text(true);
23
    loop {
24
1.19M
        let event_result = reader.read_event_into(&mut buf);
25
1.19M
        if let Ok(ref event) = event_result {
26
1.19M
            let _event = black_box(event.borrow());
27
1.19M
            let _event = black_box(event.as_ref());
28
1.19M
            debug_format!(event);
29
1.19M
            debug_format!(writer.write_event(event.borrow()));
30
1.19M
        }
31
1.19M
        match event_result {
32
853k
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
33
853k
                debug_format!(e);
34
853k
                debug_format!(e.name());
35
853k
                for a in e.attributes() {
36
140k
                    debug_format!(a);
37
140k
                    if a.ok().map_or(false, |a| a.unescape_value().is_err()) {
38
4.35k
                        break;
39
136k
                    }
40
                }
41
            }
42
110k
            Ok(Event::Text(ref e))
43
828
            | Ok(Event::Comment(ref e))
44
769
            | Ok(Event::DocType(ref e)) => {
45
111k
                debug_format!(e);
46
111k
                if let Err(err) = e.decode() {
47
0
                    debug_format!(err);
48
0
                    break;
49
111k
                }
50
            }
51
46.7k
            Ok(Event::CData(e)) => {
52
46.7k
                if let Err(err) = e.escape() {
53
0
                    let _displayed = black_box(format!("{}", err));
54
0
                    debug_format!(err);
55
0
                    break;
56
46.7k
                }
57
            }
58
75.1k
            Ok(Event::GeneralRef(ref e)) => {
59
75.1k
                debug_format!(e);
60
75.1k
                debug_format!(e.is_char_ref());
61
75.1k
                debug_format!(e.resolve_char_ref());
62
75.1k
            }
63
1.94k
            Ok(Event::PI(ref e)) => {
64
1.94k
                debug_format!(e);
65
1.94k
            }
66
2.88k
            Ok(Event::Decl(ref e)) => {
67
2.88k
                debug_format!(e);
68
2.88k
                let _ = black_box(e.version());
69
2.88k
                let _ = black_box(e.encoding());
70
2.88k
                let _ = black_box(e.standalone());
71
2.88k
            }
72
99.4k
            Ok(Event::End(e)) => {
73
99.4k
                debug_format!(e.local_name());
74
99.4k
                let name = e.name();
75
99.4k
                debug_format!(name);
76
99.4k
                debug_format!(name.prefix());
77
99.4k
                debug_format!(name.local_name());
78
99.4k
                debug_format!(name.decompose());
79
99.4k
                debug_format!(name.as_namespace_binding());
80
99.4k
                debug_format!(e);
81
99.4k
            }
82
1.34k
            Err(e) => {
83
1.34k
                debug_format!(e);
84
1.34k
                break;
85
            }
86
2.66k
            Ok(Event::Eof) => break,
87
        }
88
1.19M
        buf.clear();
89
    }
90
4.00k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
91
4.00k
}
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
});