blob: 0d0af775731c660c7212c38403e6e95ef95182ca [file] [log] [blame] [edit]
/* 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;
}