๐Ÿ“ฆ qarmin / Automated-Fuzzer

๐Ÿ“„ slint.rs ยท 44 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#![no_main]

use i_slint_compiler::diagnostics::{BuildDiagnostics, SourceFile};
use i_slint_compiler::lexer;
use i_slint_compiler::parser::parse_tokens;
use libfuzzer_sys::{fuzz_target, Corpus};

fuzz_target!(|data: &[u8]| -> Corpus {
    if let Ok(s) = std::str::from_utf8(data) {
        let mut counter = 0;
        for byte in s.bytes() {
            if byte == b'{' {
                counter += 1;
                if counter > 100 {
                    return Corpus::Reject;
                }
            }
        }


        let tokens = lexer::lex(s);
        if tokens.is_empty() {
            return Corpus::Reject;
        }

        let source_file = SourceFile::default();
        let mut diags = BuildDiagnostics::default();

        let doc_node = parse_tokens(tokens, source_file, &mut diags);

        let (_, _, _) = spin_on::spin_on(i_slint_compiler::compile_syntax_node(
            doc_node,
            diags,
            i_slint_compiler::CompilerConfiguration::new(
                i_slint_compiler::generator::OutputFormat::Llr,
            ),
        ));

        Corpus::Keep
    } else {
        Corpus::Reject
    }

});