Tests/Fuzzing: Add cmCMakePathFuzzer

Fuzz the CMake path manipulation utilities.
Tests cmake_path() operations.
This commit is contained in:
Leslie P. Polzer
2026-01-15 10:35:39 +00:00
committed by Brad King
parent e4f4ad5959
commit 78992bf2ea
3 changed files with 141 additions and 0 deletions

View File

@@ -79,3 +79,6 @@ add_fuzzer(cmStringAlgorithmsFuzzer cmStringAlgorithmsFuzzer.cxx)
# Version parser fuzzer
add_fuzzer(cmVersionFuzzer cmVersionFuzzer.cxx)
# CMake path fuzzer
add_fuzzer(cmCMakePathFuzzer cmCMakePathFuzzer.cxx)

View File

@@ -0,0 +1,61 @@
# CMake path dictionary
# Separators
"/"
"\\"
":"
# Unix paths
"/usr"
"/usr/local"
"/home"
"/tmp"
"/var"
"/etc"
"/opt"
"/bin"
"/lib"
# Windows paths
"C:"
"D:"
"C:\\"
"Program Files"
"Windows"
# CMake directories
"CMakeFiles"
"cmake"
"share"
"lib"
"include"
"bin"
"build"
"src"
"source"
# Special paths
"."
".."
"./"
"../"
"~"
# Extensions
".cmake"
".txt"
".h"
".hpp"
".c"
".cpp"
".cxx"
".a"
".so"
".dll"
".lib"
# CMake files
"CMakeLists.txt"
"CMakeCache.txt"
"cmake_install.cmake"
"CTestTestfile.cmake"

View File

@@ -0,0 +1,77 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
/*
* Fuzzer for CMake's path manipulation (cmCMakePath)
*
* Tests path parsing, normalization, and manipulation operations.
*/
#include <cstddef>
#include <cstdint>
#include <string>
#include "cmCMakePath.h"
static constexpr size_t kMaxInputSize = 4096;
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
{
if (size == 0 || size > kMaxInputSize) {
return 0;
}
std::string input(reinterpret_cast<char const*>(data), size);
// Test various path operations
cmCMakePath path(input);
// Basic queries
(void)path.IsEmpty();
(void)path.HasRootPath();
(void)path.HasRootName();
(void)path.HasRootDirectory();
(void)path.HasRelativePath();
(void)path.HasParentPath();
(void)path.HasFileName();
(void)path.HasStem();
(void)path.HasExtension();
(void)path.IsAbsolute();
(void)path.IsRelative();
// Component extraction
(void)path.GetRootName();
(void)path.GetRootDirectory();
(void)path.GetRootPath();
(void)path.GetRelativePath();
(void)path.GetParentPath();
(void)path.GetFileName();
(void)path.GetExtension();
(void)path.GetStem();
(void)path.String();
(void)path.GenericString();
// Manipulation
cmCMakePath normalized = path.Normal();
(void)normalized.String();
// If we have two paths in input, test operations between them
size_t midpoint = size / 2;
if (midpoint > 0) {
std::string input1(reinterpret_cast<char const*>(data), midpoint);
std::string input2(reinterpret_cast<char const*>(data + midpoint),
size - midpoint);
cmCMakePath path1(input1);
cmCMakePath path2(input2);
// Append operations
cmCMakePath appended = path1 / path2;
(void)appended.String();
// Comparison
(void)(path1 == path2);
}
return 0;
}