Coverage Report

Created: 2026-10-10 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/janet/test/fuzzers/fuzz_peg.c
Line
Count
Source
1
#include <stdint.h>
2
#include <stddef.h>
3
#include <janet.h>
4
5
8.86k
#define JANET_PEG_FUZZ_MAX_INPUT (1U << 20)
6
7
8.86k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
8
8.86k
    if (size < 2 || size > JANET_PEG_FUZZ_MAX_INPUT)
9
2
        return 0;
10
11
    /* Byte 0 selects the split point for a Janet PEG pattern and subject. */
12
8.86k
    size_t patlen = (size_t)data[0] % (size - 1);
13
8.86k
    const uint8_t *patsrc = data + 1;
14
8.86k
    const uint8_t *text = data + 1 + patlen;
15
8.86k
    size_t textlen = size - 1 - patlen;
16
17
8.86k
    janet_init();
18
19
8.86k
    JanetParser parser;
20
8.86k
    janet_parser_init(&parser);
21
8.86k
    Janet matchfn = janet_resolve_core("peg/match");
22
8.86k
    if (janet_checktype(matchfn, JANET_CFUNCTION)) {
23
8.86k
        JanetCFunction cfun = janet_unwrap_cfunction(matchfn);
24
25
        /* Stop after parser errors: consuming again would panic. */
26
342k
        for (size_t i = 0; i < patlen; i++) {
27
334k
            janet_parser_consume(&parser, patsrc[i]);
28
334k
            if (janet_parser_status(&parser) == JANET_PARSE_ERROR)
29
1.02k
                break;
30
334k
        }
31
8.86k
        if (janet_parser_status(&parser) != JANET_PARSE_ERROR)
32
7.84k
            janet_parser_eof(&parser);
33
34
8.86k
        if (janet_parser_status(&parser) != JANET_PARSE_ERROR &&
35
5.65k
                janet_parser_has_more(&parser)) {
36
5.50k
            Janet pattern = janet_parser_produce(&parser);
37
5.50k
            JanetTryState tstate;
38
5.50k
            if (janet_try(&tstate) == JANET_SIGNAL_OK) {
39
5.50k
                Janet argv[2];
40
5.50k
                argv[0] = pattern;
41
5.50k
                argv[1] = janet_stringv(text, (int32_t)textlen);
42
5.50k
                cfun(2, argv);
43
5.50k
            }
44
5.50k
            janet_restore(&tstate);
45
5.50k
        }
46
8.86k
    }
47
48
8.86k
    janet_parser_deinit(&parser);
49
8.86k
    janet_deinit();
50
8.86k
    return 0;
51
8.86k
}