Coverage Report

Created: 2026-07-30 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Tests/Fuzzing/cmPkgConfigParserFuzzer.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 pkg-config file parser
6
 *
7
 * CMake parses .pc files (pkg-config) when using PkgConfig find module.
8
 * Malformed .pc files from untrusted sources could trigger vulnerabilities.
9
 *
10
 * Coverage targets:
11
 * - Variable definitions (key=value)
12
 * - Keyword definitions (key: value)
13
 * - Variable references (${var})
14
 * - Multi-line handling
15
 * - Comment handling
16
 */
17
18
#include <cstddef>
19
#include <cstdint>
20
#include <string>
21
#include <vector>
22
23
#include "cmPkgConfigParser.h"
24
25
// Limit input size
26
static constexpr size_t kMaxInputSize = 64 * 1024; // 64KB
27
28
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
29
4.31k
{
30
4.31k
  if (size == 0 || size > kMaxInputSize) {
31
43
    return 0;
32
43
  }
33
34
  // cmPkgConfigParser::Parse takes non-const buffer (may modify in place)
35
4.26k
  std::vector<char> buffer(data, data + size);
36
37
4.26k
  cmPkgConfigParser parser;
38
39
  // Parse the input
40
4.26k
  auto result = parser.Parse(buffer.data(), buffer.size());
41
4.26k
  (void)result;
42
43
  // Finish parsing
44
4.26k
  result = parser.Finish();
45
4.26k
  (void)result;
46
47
4.26k
  parser.ParseComplete();
48
49
4.26k
  (void)parser.GetLiteral("Name");
50
4.26k
  (void)parser.GetLiteral("Description");
51
4.26k
  (void)parser.GetLiteral("Version");
52
4.26k
  (void)parser.GetFragments("Cflags");
53
4.26k
  (void)parser.GetFragments("Cflags.private");
54
4.26k
  (void)parser.GetFragments("CFlags");
55
4.26k
  (void)parser.GetFragments("CFlags.private");
56
4.26k
  (void)parser.GetFragments("Libs");
57
4.26k
  (void)parser.GetFragments("Libs.private");
58
4.26k
  (void)parser.GetDependencies("Requires");
59
4.26k
  (void)parser.GetDependencies("Requires.private");
60
4.26k
  (void)parser.GetDependencies("Conflicts");
61
4.26k
  (void)parser.GetDependencies("Provides");
62
63
4.26k
  return 0;
64
4.31k
}