summaryrefslogtreecommitdiffstats
path: root/test/fuzz.c
blob: 3f11d9d748e4f795df510b5490e9c2e7de5637b8 (plain)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "ts.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef int (*ts_func_t)(fp_t * const *, uint_t, fp_t const * const *, uint_t, uint_t, ts_constant_t const *);

typedef struct {
    ts_func_t func;
    uint_t xn;
    uint_t yn;
} fuzz_entry_t;

#include "fuzz_table_generated.c"

static const uint_t _fuzz_n = _fuzz_generated_n;
static const fuzz_entry_t *_fuzz_table = _fuzz_table_generated;

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
    if (size < 2)
        return 0;

    uint_t func_idx = data[0];
    uint_t config = data[1];

    uint_t n = 4;
    if (size > 2)
        n = (uint_t)(data[2] + 4);
    if (n > 256)
        n = 256;

    fp_t input[256];
    fp_t output[256];
    fp_t output2[256];
    fp_t output3[256];

    size_t offset = 3;
    for (uint_t i = 0; i < n && offset + 8 <= size; i++, offset += 8)
    {
        memcpy(&input[i], data + offset, sizeof(fp_t));
    }
    for (uint_t i = (offset - 3) / 8; i < n; i++)
        input[i] = 0;

    fp_t *x_arrays[5] = {input, input, input, input, input};
    fp_t *y_arrays[3] = {output, output2, output3};

    uint_t period = 5;
    if (config > 0)
        period = config;
    if (period < 1)
        period = 1;
    if (period > n)
        period = n;

    uint_t idx = func_idx % _fuzz_n;
    fuzz_entry_t entry = _fuzz_table[idx];

    uint_t xn = entry.xn;
    uint_t yn = entry.yn;
    if (xn > 5) xn = 5;
    if (yn > 3) yn = 3;

    (void)entry.func(y_arrays, yn, (fp_t const * const *)x_arrays, xn, n, (ts_constant_t *)&period);

    return 0;
}