Coverage Report

Created: 2026-02-09 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Tests/Fuzzing/cmGccDepfileFuzzer.cxx
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
4
/*
5
 * Fuzzer for CMake's GCC dependency file parser
6
 *
7
 * GCC generates .d files with make-style dependencies.
8
 * This fuzzer tests parsing of these files.
9
 */
10
11
#include <cstddef>
12
#include <cstdint>
13
#include <cstdio>
14
#include <string>
15
16
#include <unistd.h>
17
18
#include "cmGccDepfileReader.h"
19
#include "cmSystemTools.h"
20
21
static constexpr size_t kMaxInputSize = 256 * 1024;
22
static std::string g_testDir;
23
24
extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv)
25
6
{
26
6
  (void)argc;
27
6
  (void)argv;
28
29
6
  char tmpl[] = "/tmp/cmake_fuzz_depfile_XXXXXX";
30
6
  char* dir = mkdtemp(tmpl);
31
6
  if (dir) {
32
6
    g_testDir = dir;
33
6
  } else {
34
0
    g_testDir = "/tmp/cmake_fuzz_depfile";
35
0
    cmSystemTools::MakeDirectory(g_testDir);
36
0
  }
37
38
6
  return 0;
39
6
}
40
41
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
42
5.45k
{
43
5.45k
  if (size == 0 || size > kMaxInputSize) {
44
6
    return 0;
45
6
  }
46
47
  // Write input to temp file
48
5.44k
  std::string depFile = g_testDir + "/test.d";
49
5.44k
  {
50
5.44k
    FILE* fp = fopen(depFile.c_str(), "wb");
51
5.44k
    if (!fp)
52
0
      return 0;
53
5.44k
    fwrite(data, 1, size, fp);
54
5.44k
    fclose(fp);
55
5.44k
  }
56
57
  // Parse the depfile
58
0
  auto result = cmReadGccDepfile(depFile.c_str());
59
60
  // Examine results if parsing succeeded
61
5.44k
  if (result) {
62
50.3k
    for (auto const& entry : *result) {
63
83.0k
      for (auto const& rule : entry.rules) {
64
83.0k
        (void)rule;
65
83.0k
      }
66
94.8k
      for (auto const& path : entry.paths) {
67
94.8k
        (void)path;
68
94.8k
      }
69
50.3k
    }
70
5.37k
  }
71
72
  // Clean up
73
5.44k
  unlink(depFile.c_str());
74
75
5.44k
  return 0;
76
5.44k
}