From 07e18043145f3d91c8ea7ec3ad41b3c905585277 Mon Sep 17 00:00:00 2001 From: Ethan Werner Date: Wed, 1 Jul 2026 09:42:39 +0400 Subject: initial commit: ts time series analysis library v0.1.0 - 354 financial and mathematical time-series indicators - Uniform C11 API with consistent function signatures - 349 passing tests with -Werror - Static and shared library builds - pkg-config integration - Python bindings - Fuzzing and sanitizer support - Security hardening flags --- test/fuzz.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 test/fuzz.c (limited to 'test/fuzz.c') 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 +#include +#include + +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; +} -- cgit v1.3.1