/proc/self/cwd/test/fuzz.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include <cassert> |
2 | | #include <cxxopts.hpp> |
3 | | #include <fuzzer/FuzzedDataProvider.h> |
4 | | |
5 | | constexpr int kMaxOptions = 1024; |
6 | | constexpr int kMaxArgSize = 1024; |
7 | | |
8 | | enum class ParseableTypes |
9 | | { |
10 | | kInt, |
11 | | kString, |
12 | | kVectorString, |
13 | | kFloat, |
14 | | kDouble, |
15 | | |
16 | | // Marker for fuzzer. |
17 | | kMaxValue, |
18 | | }; |
19 | | |
20 | | template <typename T> |
21 | | void |
22 | | add_fuzzed_option(cxxopts::Options* options, FuzzedDataProvider* provider) |
23 | 21.5k | { |
24 | 21.5k | assert(options); |
25 | 21.5k | assert(provider); |
26 | | |
27 | 21.5k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), |
28 | 21.5k | provider->ConsumeRandomLengthString(kMaxArgSize), |
29 | 21.5k | cxxopts::value<T>()); |
30 | 21.5k | } void add_fuzzed_option<int>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 4.48k | { | 24 | 4.48k | assert(options); | 25 | 4.48k | assert(provider); | 26 | | | 27 | 4.48k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 4.48k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 4.48k | cxxopts::value<T>()); | 30 | 4.48k | } |
void add_fuzzed_option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 3.43k | { | 24 | 3.43k | assert(options); | 25 | 3.43k | assert(provider); | 26 | | | 27 | 3.43k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 3.43k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 3.43k | cxxopts::value<T>()); | 30 | 3.43k | } |
void add_fuzzed_option<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 4.87k | { | 24 | 4.87k | assert(options); | 25 | 4.87k | assert(provider); | 26 | | | 27 | 4.87k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 4.87k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 4.87k | cxxopts::value<T>()); | 30 | 4.87k | } |
void add_fuzzed_option<float>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 6.12k | { | 24 | 6.12k | assert(options); | 25 | 6.12k | assert(provider); | 26 | | | 27 | 6.12k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 6.12k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 6.12k | cxxopts::value<T>()); | 30 | 6.12k | } |
void add_fuzzed_option<double>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 2.67k | { | 24 | 2.67k | assert(options); | 25 | 2.67k | assert(provider); | 26 | | | 27 | 2.67k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 2.67k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 2.67k | cxxopts::value<T>()); | 30 | 2.67k | } |
|
31 | | |
32 | | extern "C" int |
33 | | LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
34 | 3.76k | { |
35 | 3.76k | try |
36 | 3.76k | { |
37 | 3.76k | FuzzedDataProvider provider(data, size); |
38 | | |
39 | | // Randomly generate a usage string. |
40 | 3.76k | cxxopts::Options options(provider.ConsumeRandomLengthString(kMaxArgSize), |
41 | 3.76k | provider.ConsumeRandomLengthString(kMaxArgSize)); |
42 | | |
43 | | // Randomly generate a set of flags configurations. |
44 | 26.5k | for (int i = 0; i < provider.ConsumeIntegralInRange<int>(0, kMaxOptions); |
45 | 22.7k | i++) |
46 | 23.0k | { |
47 | 23.0k | switch (provider.ConsumeEnum<ParseableTypes>()) |
48 | 23.0k | { |
49 | 4.48k | case ParseableTypes::kInt: |
50 | 4.48k | add_fuzzed_option<int>(&options, &provider); |
51 | 4.48k | break; |
52 | 3.43k | case ParseableTypes::kString: |
53 | 3.43k | add_fuzzed_option<std::string>(&options, &provider); |
54 | 3.43k | break; |
55 | 4.87k | case ParseableTypes::kVectorString: |
56 | 4.87k | add_fuzzed_option<std::vector<std::string>>(&options, &provider); |
57 | 4.87k | break; |
58 | 6.12k | case ParseableTypes::kFloat: |
59 | 6.12k | add_fuzzed_option<float>(&options, &provider); |
60 | 6.12k | break; |
61 | 2.67k | case ParseableTypes::kDouble: |
62 | 2.67k | add_fuzzed_option<double>(&options, &provider); |
63 | 2.67k | break; |
64 | 1.47k | default: |
65 | 1.47k | break; |
66 | 23.0k | } |
67 | 23.0k | } |
68 | | // Sometimes allow unrecognised options. |
69 | 3.46k | if (provider.ConsumeBool()) |
70 | 1.03k | { |
71 | 1.03k | options.allow_unrecognised_options(); |
72 | 1.03k | } |
73 | | // Sometimes allow trailing positional arguments. |
74 | 3.46k | if (provider.ConsumeBool()) |
75 | 1.00k | { |
76 | 1.00k | std::string positional_option_name = |
77 | 1.00k | provider.ConsumeRandomLengthString(kMaxArgSize); |
78 | 1.00k | options.add_options()(positional_option_name, |
79 | 1.00k | provider.ConsumeRandomLengthString(kMaxArgSize), |
80 | 1.00k | cxxopts::value<std::vector<std::string>>()); |
81 | 1.00k | options.parse_positional({positional_option_name}); |
82 | 1.00k | } |
83 | | |
84 | | // Build command line input. |
85 | 3.46k | const int argc = provider.ConsumeIntegralInRange<int>(1, kMaxOptions); |
86 | | |
87 | 3.46k | std::vector<std::string> command_line_container; |
88 | 3.46k | command_line_container.reserve(argc); |
89 | | |
90 | 3.46k | std::vector<const char*> argv; |
91 | 3.46k | argv.reserve(argc); |
92 | | |
93 | 851k | for (int i = 0; i < argc; i++) |
94 | 848k | { |
95 | 848k | command_line_container.push_back( |
96 | 848k | provider.ConsumeRandomLengthString(kMaxArgSize)); |
97 | 848k | argv.push_back(command_line_container[i].c_str()); |
98 | 848k | } |
99 | | |
100 | | // Parse command line; |
101 | 3.46k | auto result = options.parse(argc, argv.data()); |
102 | 3.46k | } catch (...) |
103 | 3.76k | { |
104 | 816 | } |
105 | | |
106 | 3.76k | return 0; |
107 | 3.76k | } |