| /* 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 math expression parser |
| * |
| * The math() command uses cmExprParserHelper to evaluate mathematical |
| * expressions. This fuzzer tests the expression parser for crashes, |
| * hangs, and undefined behavior. |
| * |
| * Coverage targets: |
| * - Integer arithmetic parsing |
| * - Operator precedence handling |
| * - Parentheses nesting |
| * - Error handling for invalid expressions |
| */ |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <string> |
| |
| #include "cmExprParserHelper.h" |
| |
| // Limit input size to prevent DoS via deeply nested expressions |
| static constexpr size_t kMaxInputSize = 4096; |
| |
| extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size) |
| { |
| if (size == 0 || size > kMaxInputSize) { |
| return 0; |
| } |
| |
| // Create null-terminated string |
| std::string input(reinterpret_cast<char const*>(data), size); |
| |
| cmExprParserHelper helper; |
| |
| // Parse with different verbosity levels |
| int result = helper.ParseString(input.c_str(), 0); |
| (void)result; |
| |
| // Always check result and error accessors |
| (void)helper.GetResult(); |
| (void)helper.GetError(); |
| (void)helper.GetWarning(); |
| |
| return 0; |
| } |