Coverage Report

Created: 2025-10-10 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/checksum_fuzzer.c
Line
Count
Source
1
#include <stdio.h>
2
#include <stddef.h>
3
#include <stdint.h>
4
#include <string.h>
5
#include <assert.h>
6
#include <stdlib.h>
7
#include <inttypes.h>
8
#include "zlib.h"
9
10
539
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) {
11
539
  uint32_t crc0 = crc32(0L, NULL, 0);
12
539
  uint32_t crc1 = crc0;
13
539
  uint32_t crc2 = crc0;
14
539
  uint32_t adler0 = adler32(0L, NULL, 0);
15
539
  uint32_t adler1 = adler0;
16
539
  uint32_t adler2 = adler0;
17
  /* Checksum with a buffer of size equal to the first byte in the input. */
18
539
  uint32_t buffSize = data[0];
19
539
  uint32_t offset = 0;
20
539
  uint32_t op;
21
22
  /* Discard inputs larger than 1Mb. */
23
539
  static size_t kMaxSize = 1024 * 1024;
24
539
  if (dataLen < 1 || dataLen > kMaxSize)
25
0
    return 0;
26
27
  /* Make sure the buffer has at least a byte. */
28
539
  if (buffSize == 0)
29
111
    ++buffSize;
30
31
  /* CRC32 */
32
539
  op = crc32_combine_gen(buffSize);
33
4.28M
  for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) {
34
4.28M
    uint32_t crc3 = crc32_z(crc0, data + offset, buffSize);
35
4.28M
    uint32_t crc4 = crc32_combine_op(crc1, crc3, op);
36
4.28M
    crc1 = crc32_z(crc1, data + offset, buffSize);
37
4.28M
    assert(crc1 == crc4);
38
4.28M
  }
39
539
  crc1 = crc32_z(crc1, data + offset, dataLen % buffSize);
40
41
539
  crc2 = crc32(crc2, data, (uint32_t) dataLen);
42
43
539
  assert(crc1 == crc2);
44
539
  assert(crc32_combine(crc1, crc2, dataLen) ==
45
539
         crc32_combine(crc1, crc1, dataLen));
46
47
  /* Fast CRC32 combine. */
48
539
  op = crc32_combine_gen(dataLen);
49
539
  assert(crc32_combine_op(crc1, crc2, op) ==
50
539
         crc32_combine_op(crc2, crc1, op));
51
539
  assert(crc32_combine(crc1, crc2, dataLen) ==
52
539
         crc32_combine_op(crc2, crc1, op));
53
54
  /* Adler32 */
55
4.28M
  for (offset = 0; offset + buffSize <= dataLen; offset += buffSize)
56
4.28M
    adler1 = adler32_z(adler1, data + offset, buffSize);
57
539
  adler1 = adler32_z(adler1, data + offset, dataLen % buffSize);
58
59
539
  adler2 = adler32(adler2, data, (uint32_t) dataLen);
60
61
539
  assert(adler1 == adler2);
62
539
  assert(adler32_combine(adler1, adler2, dataLen) ==
63
539
         adler32_combine(adler1, adler1, dataLen));
64
65
  /* This function must return 0. */
66
539
  return 0;
67
539
}