| /* 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; |
| } |