diff options
| author | Ethan Werner <mail@ethanwerner.com> | 2026-07-01 09:42:39 +0400 |
|---|---|---|
| committer | Ethan Werner <mail@ethanwerner.com> | 2026-07-01 09:42:39 +0400 |
| commit | 07e18043145f3d91c8ea7ec3ad41b3c905585277 (patch) | |
| tree | 2bdeae46973f4bdfce263679a4008ac768011f28 /test/fuzz.c | |
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
Diffstat (limited to 'test/fuzz.c')
| -rw-r--r-- | test/fuzz.c | 68 |
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; +} |