blob: c733df1222daa7c6f570aa9ba9e02c8f8c86406a [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 version comparison
*
* Tests version string parsing and comparison operations.
*/
#include <cstddef>
#include <cstdint>
#include <string>
#include "cmSystemTools.h"
#include "cmVersion.h"
static constexpr size_t kMaxInputSize = 1024;
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 version comparison with current CMake version
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, input, "3.28.0");
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER, input,
"3.28.0");
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL, input,
"3.28.0");
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_LESS_EQUAL, input,
"3.28.0");
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL, input,
"3.28.0");
// Compare against itself
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL, input, input);
// If input is large enough, compare two different versions from input
if (size >= 4) {
std::string v1(reinterpret_cast<char const*>(data), size / 2);
std::string v2(reinterpret_cast<char const*>(data + size / 2),
size - size / 2);
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, v1, v2);
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER, v1, v2);
(void)cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL, v1, v2);
}
// Version compare with greater/less string format
(void)cmSystemTools::VersionCompareGreater(input, "1.0.0");
(void)cmSystemTools::VersionCompareGreaterEq(input, "1.0.0");
return 0;
}