Coverage Report

Created: 2026-08-14 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/quick-xml/fuzz/fuzz_targets/fuzz_target_1.rs
Line
Count
Source
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, XmlVersion};
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
17.7k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
17.7k
where
16
17.7k
    R: std::io::BufRead,
17
{
18
17.7k
    let mut version = XmlVersion::Implicit1_0;
19
17.7k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
20
17.7k
    let mut buf = vec![];
21
17.7k
    let config = reader.config_mut();
22
17.7k
    config.expand_empty_elements = true;
23
17.7k
    config.trim_text(true);
24
    loop {
25
14.0M
        let event_result = reader.read_event_into(&mut buf);
26
14.0M
        if let Ok(ref event) = event_result {
27
14.0M
            let _event = black_box(event.borrow());
28
14.0M
            let _event = black_box(event.as_ref());
29
14.0M
            debug_format!(event);
30
14.0M
            debug_format!(writer.write_event(event.borrow()));
31
14.0M
        }
32
14.0M
        match event_result {
33
11.3M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
34
11.3M
                debug_format!(e);
35
11.3M
                debug_format!(e.name());
36
11.3M
                for a in e.attributes() {
37
1.71M
                    debug_format!(a);
38
1.71M
                    if a.ok()
39
1.71M
                        .map_or(false, |a| a.normalized_value(version).is_err())
fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>::{closure#0}
Line
Count
Source
39
366k
                        .map_or(false, |a| a.normalized_value(version).is_err())
fuzz_target_1::round_trip::<&[u8]>::{closure#0}
Line
Count
Source
39
113k
                        .map_or(false, |a| a.normalized_value(version).is_err())
40
                    {
41
9.28k
                        break;
42
1.70M
                    }
43
                }
44
            }
45
436k
            Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => {
46
436k
                debug_format!(e);
47
436k
            }
48
121k
            Ok(Event::CData(e)) => {
49
121k
                if let Err(err) = e.escape() {
50
0
                    let _displayed = black_box(format!("{}", err));
51
0
                    debug_format!(err);
52
0
                    break;
53
121k
                }
54
            }
55
74.8k
            Ok(Event::GeneralRef(ref e)) => {
56
74.8k
                debug_format!(e);
57
74.8k
                debug_format!(e.is_char_ref());
58
74.8k
                debug_format!(e.resolve_char_ref());
59
74.8k
            }
60
6.04k
            Ok(Event::PI(ref e)) => {
61
6.04k
                debug_format!(e);
62
6.04k
            }
63
7.63k
            Ok(Event::Decl(ref e)) => {
64
7.63k
                debug_format!(e);
65
7.63k
                let _ = black_box(e.version());
66
7.63k
                let _ = black_box(e.encoding());
67
7.63k
                let _ = black_box(e.standalone());
68
7.63k
                match e.xml_version() {
69
6.67k
                    Ok(v) => version = v,
70
962
                    Err(_) => break,
71
                }
72
            }
73
1.99M
            Ok(Event::End(e)) => {
74
1.99M
                debug_format!(e.local_name());
75
1.99M
                let name = e.name();
76
1.99M
                debug_format!(name);
77
1.99M
                debug_format!(name.prefix());
78
1.99M
                debug_format!(name.local_name());
79
1.99M
                debug_format!(name.decompose());
80
1.99M
                debug_format!(name.as_namespace_binding());
81
1.99M
                debug_format!(e);
82
1.99M
            }
83
7.13k
            Err(e) => {
84
7.13k
                debug_format!(e);
85
7.13k
                break;
86
            }
87
9.65k
            Ok(Event::Eof) => break,
88
        }
89
14.0M
        buf.clear();
90
    }
91
17.7k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
92
17.7k
}
fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>
Line
Count
Source
14
9.96k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
9.96k
where
16
9.96k
    R: std::io::BufRead,
17
{
18
9.96k
    let mut version = XmlVersion::Implicit1_0;
19
9.96k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
20
9.96k
    let mut buf = vec![];
21
9.96k
    let config = reader.config_mut();
22
9.96k
    config.expand_empty_elements = true;
23
9.96k
    config.trim_text(true);
24
    loop {
25
8.44M
        let event_result = reader.read_event_into(&mut buf);
26
8.44M
        if let Ok(ref event) = event_result {
27
8.44M
            let _event = black_box(event.borrow());
28
8.44M
            let _event = black_box(event.as_ref());
29
8.44M
            debug_format!(event);
30
8.44M
            debug_format!(writer.write_event(event.borrow()));
31
8.44M
        }
32
8.44M
        match event_result {
33
6.84M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
34
6.84M
                debug_format!(e);
35
6.84M
                debug_format!(e.name());
36
6.84M
                for a in e.attributes() {
37
1.31M
                    debug_format!(a);
38
1.31M
                    if a.ok()
39
1.31M
                        .map_or(false, |a| a.normalized_value(version).is_err())
40
                    {
41
5.07k
                        break;
42
1.31M
                    }
43
                }
44
            }
45
264k
            Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => {
46
264k
                debug_format!(e);
47
264k
            }
48
80.6k
            Ok(Event::CData(e)) => {
49
80.6k
                if let Err(err) = e.escape() {
50
0
                    let _displayed = black_box(format!("{}", err));
51
0
                    debug_format!(err);
52
0
                    break;
53
80.6k
                }
54
            }
55
39.4k
            Ok(Event::GeneralRef(ref e)) => {
56
39.4k
                debug_format!(e);
57
39.4k
                debug_format!(e.is_char_ref());
58
39.4k
                debug_format!(e.resolve_char_ref());
59
39.4k
            }
60
3.25k
            Ok(Event::PI(ref e)) => {
61
3.25k
                debug_format!(e);
62
3.25k
            }
63
4.17k
            Ok(Event::Decl(ref e)) => {
64
4.17k
                debug_format!(e);
65
4.17k
                let _ = black_box(e.version());
66
4.17k
                let _ = black_box(e.encoding());
67
4.17k
                let _ = black_box(e.standalone());
68
4.17k
                match e.xml_version() {
69
3.65k
                    Ok(v) => version = v,
70
517
                    Err(_) => break,
71
                }
72
            }
73
1.19M
            Ok(Event::End(e)) => {
74
1.19M
                debug_format!(e.local_name());
75
1.19M
                let name = e.name();
76
1.19M
                debug_format!(name);
77
1.19M
                debug_format!(name.prefix());
78
1.19M
                debug_format!(name.local_name());
79
1.19M
                debug_format!(name.decompose());
80
1.19M
                debug_format!(name.as_namespace_binding());
81
1.19M
                debug_format!(e);
82
1.19M
            }
83
4.61k
            Err(e) => {
84
4.61k
                debug_format!(e);
85
4.61k
                break;
86
            }
87
4.82k
            Ok(Event::Eof) => break,
88
        }
89
8.43M
        buf.clear();
90
    }
91
9.96k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
92
9.96k
}
fuzz_target_1::round_trip::<&[u8]>
Line
Count
Source
14
7.78k
fn round_trip<R>(reader: &mut Reader<R>) -> ()
15
7.78k
where
16
7.78k
    R: std::io::BufRead,
17
{
18
7.78k
    let mut version = XmlVersion::Implicit1_0;
19
7.78k
    let mut writer = Writer::new(Cursor::new(Vec::new()));
20
7.78k
    let mut buf = vec![];
21
7.78k
    let config = reader.config_mut();
22
7.78k
    config.expand_empty_elements = true;
23
7.78k
    config.trim_text(true);
24
    loop {
25
5.60M
        let event_result = reader.read_event_into(&mut buf);
26
5.60M
        if let Ok(ref event) = event_result {
27
5.59M
            let _event = black_box(event.borrow());
28
5.59M
            let _event = black_box(event.as_ref());
29
5.59M
            debug_format!(event);
30
5.59M
            debug_format!(writer.write_event(event.borrow()));
31
5.59M
        }
32
5.59M
        match event_result {
33
4.54M
            Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {
34
4.54M
                debug_format!(e);
35
4.54M
                debug_format!(e.name());
36
4.54M
                for a in e.attributes() {
37
397k
                    debug_format!(a);
38
397k
                    if a.ok()
39
397k
                        .map_or(false, |a| a.normalized_value(version).is_err())
40
                    {
41
4.20k
                        break;
42
393k
                    }
43
                }
44
            }
45
171k
            Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => {
46
171k
                debug_format!(e);
47
171k
            }
48
40.5k
            Ok(Event::CData(e)) => {
49
40.5k
                if let Err(err) = e.escape() {
50
0
                    let _displayed = black_box(format!("{}", err));
51
0
                    debug_format!(err);
52
0
                    break;
53
40.5k
                }
54
            }
55
35.4k
            Ok(Event::GeneralRef(ref e)) => {
56
35.4k
                debug_format!(e);
57
35.4k
                debug_format!(e.is_char_ref());
58
35.4k
                debug_format!(e.resolve_char_ref());
59
35.4k
            }
60
2.79k
            Ok(Event::PI(ref e)) => {
61
2.79k
                debug_format!(e);
62
2.79k
            }
63
3.45k
            Ok(Event::Decl(ref e)) => {
64
3.45k
                debug_format!(e);
65
3.45k
                let _ = black_box(e.version());
66
3.45k
                let _ = black_box(e.encoding());
67
3.45k
                let _ = black_box(e.standalone());
68
3.45k
                match e.xml_version() {
69
3.01k
                    Ok(v) => version = v,
70
445
                    Err(_) => break,
71
                }
72
            }
73
800k
            Ok(Event::End(e)) => {
74
800k
                debug_format!(e.local_name());
75
800k
                let name = e.name();
76
800k
                debug_format!(name);
77
800k
                debug_format!(name.prefix());
78
800k
                debug_format!(name.local_name());
79
800k
                debug_format!(name.decompose());
80
800k
                debug_format!(name.as_namespace_binding());
81
800k
                debug_format!(e);
82
800k
            }
83
2.51k
            Err(e) => {
84
2.51k
                debug_format!(e);
85
2.51k
                break;
86
            }
87
4.82k
            Ok(Event::Eof) => break,
88
        }
89
5.59M
        buf.clear();
90
    }
91
7.78k
    let _round_trip = std::hint::black_box(writer.into_inner().into_inner());
92
7.78k
}
93
94
fuzz_target!(|data: &[u8]| {
95
    // From reader
96
    let cursor = Cursor::new(data);
97
    let mut reader = Reader::from_reader(cursor);
98
    _ = std::hint::black_box(round_trip(&mut reader));
99
100
    // From str
101
    if let Ok(s) = std::str::from_utf8(data) {
102
        let mut reader = Reader::from_str(s);
103
        _ = std::hint::black_box(round_trip(&mut reader));
104
    }
105
});