diff options
| author | Leitwolf | 2026-10-24 19:03:40 +0300 |
|---|---|---|
| committer | GitHub | 2026-10-24 19:03:40 +0300 |
| commit | 4f1c759cffcb14bd6511e1d7c5fbace682e24f2d (patch) | |
| tree | 415fe5d48a5b48650bba3747beaf245d727c4f61 /fuzzing/Progmasoft/fuzz_RunnerOptions.cpp | |
| parent | 83c6fc3ac13abe83fa39f7b5f8559ccaf4412233 (diff) | |
| parent | 622188f9c08e4af35941c146979883ed4882410e (diff) | |
| download | catch3-4f1c759cffcb14bd6511e1d7c5fbace682e24f2d.tar.gz | |
Merge pull request #15 from Progmasoft/feature/catch3-runner
Replace Catch2's runner with the Catch3 runner
Diffstat (limited to 'fuzzing/Progmasoft/fuzz_RunnerOptions.cpp')
| -rw-r--r-- | fuzzing/Progmasoft/fuzz_RunnerOptions.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/fuzzing/Progmasoft/fuzz_RunnerOptions.cpp b/fuzzing/Progmasoft/fuzz_RunnerOptions.cpp new file mode 100644 index 00000000..2a10ba91 --- /dev/null +++ b/fuzzing/Progmasoft/fuzz_RunnerOptions.cpp @@ -0,0 +1,50 @@ +// Copyright (c) 2026 Progmasoft. +// SPDX-License-Identifier: MPL-2.0 WITH AdditionRef-Progmasoft-Exception-1.1 + +// The command line of a test binary: arguments separated by NUL bytes. The +// parser must answer with options or an error, never crash, and the worker +// arguments it derives must parse again. + +#include <Progmasoft/Runner/Options.hpp> + +#include <cstdint> +#include <cstdlib> +#include <string> +#include <vector> + +extern "C" int +LLVMFuzzerTestOneInput(const std::uint8_t *data, std::size_t size) +{ + std::vector<std::string> arguments(1); + for (std::size_t index = 0; index < size; ++index) + { + if (data[index] == 0) + { + arguments.emplace_back(); + } + else + { + arguments.back().push_back(static_cast<char>(data[index])); + } + } + // Reading a file named by --input-file is not what is fuzzed here. + for (const auto &argument : arguments) + { + if (argument.find("input-file") != std::string::npos || + (argument.size() >= 2 && argument[0] == '-' && argument[1] == 'f')) + { + return 0; + } + } + auto options = Progmasoft::Catch3::Runner::ParseOptions(arguments); + if (options) + { + const auto worker = Progmasoft::Catch3::Runner::ParseOptions( + Progmasoft::Catch3::Runner::WorkerArguments(*options)); + if (!worker) + { + std::abort(); + } + } + return 0; +} |