Coverage Report

Created: 2026-07-16 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/c-blosc2/tests/fuzz/fuzz_compress_chunk.c
Line
Count
Source
1
#include <stdint.h>
2
#include <stdlib.h>
3
4
#include <blosc2.h>
5
6
18.6k
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
7
8
#ifdef __cplusplus
9
extern "C" {
10
#endif
11
12
18.6k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
13
18.6k
  const char *const compressors[] = { "blosclz", "lz4", "lz4hc", "zlib", "zstd" };
14
18.6k
  const int num_comp = ARRAY_SIZE(compressors);
15
18.6k
  int level = 9, filter = BLOSC_BITSHUFFLE, cindex = 0, i = 0;
16
18.6k
  size_t nbytes, cbytes, blocksize;
17
18.6k
  void *output, *input;
18
19
18.6k
  blosc2_set_nthreads(1);
20
21
18.6k
  if (size > 0)
22
18.6k
    level = data[0] % (9 + 1);
23
18.6k
  if (size > 1)
24
18.6k
    filter = data[1] % (BLOSC_BITSHUFFLE + 1);
25
18.6k
  if (size > 2)
26
18.6k
    cindex = data[2];
27
28
  /* Find next available compressor */
29
18.6k
  while (blosc1_set_compressor(compressors[cindex % num_comp]) == -1 && i < num_comp) {
30
0
    cindex++, i++;
31
0
  }
32
18.6k
  if (i == num_comp) {
33
    /* No compressors available */
34
0
    return 0;
35
0
  }
36
37
18.6k
  if (size > 3 && data[3] % 7 == 0)
38
4.00k
    blosc1_set_blocksize(4096);
39
40
18.6k
  output = malloc(size + 1);
41
18.6k
  if (output == NULL)
42
0
    return 0;
43
44
18.6k
  int csize = blosc2_compress(level, filter, 1, data, size, output, size);
45
18.6k
  if (csize <= 0) {
46
    /* Cannot compress src buffer into dest */
47
7.25k
    free(output);
48
7.25k
    return 0;
49
7.25k
  }
50
51
11.4k
  blosc1_cbuffer_sizes(output, &nbytes, &cbytes, &blocksize);
52
53
  /* Don't allow address sanitizer to allocate more than INT32_MAX */
54
11.4k
  if (cbytes >= INT32_MAX) {
55
0
    free(output);
56
0
    return 0;
57
0
  }
58
59
11.4k
  input = malloc(cbytes);
60
11.4k
  if (input != NULL) {
61
11.4k
    blosc1_decompress(output, input, cbytes);
62
11.4k
    free(input);
63
11.4k
  }
64
65
11.4k
  free(output);
66
67
11.4k
  return 0;
68
11.4k
}
69
70
#ifdef __cplusplus
71
}
72
#endif