summaryrefslogtreecommitdiffstats
path: root/test/fuzz.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/fuzz.c')
-rw-r--r--test/fuzz.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/fuzz.c b/test/fuzz.c
new file mode 100644
index 0000000..3f11d9d
--- /dev/null
+++ b/test/fuzz.c
@@ -0,0 +1,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;
+}