/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.7k | { |
24 | 21.7k | assert(options); |
25 | 21.7k | assert(provider); |
26 | | |
27 | 21.7k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), |
28 | 21.7k | provider->ConsumeRandomLengthString(kMaxArgSize), |
29 | 21.7k | cxxopts::value<T>()); |
30 | 21.7k | } void add_fuzzed_option<int>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 4.41k | { | 24 | 4.41k | assert(options); | 25 | 4.41k | assert(provider); | 26 | | | 27 | 4.41k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 4.41k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 4.41k | cxxopts::value<T>()); | 30 | 4.41k | } |
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.76k | { | 24 | 3.76k | assert(options); | 25 | 3.76k | assert(provider); | 26 | | | 27 | 3.76k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 3.76k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 3.76k | cxxopts::value<T>()); | 30 | 3.76k | } |
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 | 5.38k | { | 24 | 5.38k | assert(options); | 25 | 5.38k | assert(provider); | 26 | | | 27 | 5.38k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 5.38k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 5.38k | cxxopts::value<T>()); | 30 | 5.38k | } |
void add_fuzzed_option<float>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 5.67k | { | 24 | 5.67k | assert(options); | 25 | 5.67k | assert(provider); | 26 | | | 27 | 5.67k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 5.67k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 5.67k | cxxopts::value<T>()); | 30 | 5.67k | } |
void add_fuzzed_option<double>(cxxopts::Options*, FuzzedDataProvider*) Line | Count | Source | 23 | 2.46k | { | 24 | 2.46k | assert(options); | 25 | 2.46k | assert(provider); | 26 | | | 27 | 2.46k | options->add_options()(provider->ConsumeRandomLengthString(kMaxArgSize), | 28 | 2.46k | provider->ConsumeRandomLengthString(kMaxArgSize), | 29 | 2.46k | cxxopts::value<T>()); | 30 | 2.46k | } |
|
31 | | |
32 | | extern "C" int |
33 | | LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
34 | 3.84k | { |
35 | 3.84k | try |
36 | 3.84k | { |
37 | 3.84k | FuzzedDataProvider provider(data, size); |
38 | | |
39 | | // Randomly generate a usage string. |
40 | 3.84k | cxxopts::Options options(provider.ConsumeRandomLengthString(kMaxArgSize), |
41 | 3.84k | provider.ConsumeRandomLengthString(kMaxArgSize)); |
42 | | |
43 | | // Randomly generate a set of flags configurations. |
44 | 26.8k | for (int i = 0; i < provider.ConsumeIntegralInRange<int>(0, kMaxOptions); |
45 | 22.9k | i++) |
46 | 23.2k | { |
47 | 23.2k | switch (provider.ConsumeEnum<ParseableTypes>()) |
48 | 23.2k | { |
49 | 4.41k | case ParseableTypes::kInt: |
50 | 4.41k | add_fuzzed_option<int>(&options, &provider); |
51 | 4.41k | break; |
52 | 3.76k | case ParseableTypes::kString: |
53 | 3.76k | add_fuzzed_option<std::string>(&options, &provider); |
54 | 3.76k | break; |
55 | 5.38k | case ParseableTypes::kVectorString: |
56 | 5.38k | add_fuzzed_option<std::vector<std::string>>(&options, &provider); |
57 | 5.38k | break; |
58 | 5.67k | case ParseableTypes::kFloat: |
59 | 5.67k | add_fuzzed_option<float>(&options, &provider); |
60 | 5.67k | break; |
61 | 2.46k | case ParseableTypes::kDouble: |
62 | 2.46k | add_fuzzed_option<double>(&options, &provider); |
63 | 2.46k | break; |
64 | 1.52k | default: |
65 | 1.52k | break; |
66 | 23.2k | } |
67 | 23.2k | } |
68 | | // Sometimes allow unrecognised options. |
69 | 3.58k | if (provider.ConsumeBool()) |
70 | 1.09k | { |
71 | 1.09k | options.allow_unrecognised_options(); |
72 | 1.09k | } |
73 | | // Sometimes allow trailing positional arguments. |
74 | 3.58k | if (provider.ConsumeBool()) |
75 | 1.07k | { |
76 | 1.07k | std::string positional_option_name = |
77 | 1.07k | provider.ConsumeRandomLengthString(kMaxArgSize); |
78 | 1.07k | options.add_options()(positional_option_name, |
79 | 1.07k | provider.ConsumeRandomLengthString(kMaxArgSize), |
80 | 1.07k | cxxopts::value<std::vector<std::string>>()); |
81 | 1.07k | options.parse_positional({positional_option_name}); |
82 | 1.07k | } |
83 | | |
84 | | // Build command line input. |
85 | 3.58k | const int argc = provider.ConsumeIntegralInRange<int>(1, kMaxOptions); |
86 | | |
87 | 3.58k | std::vector<std::string> command_line_container; |
88 | 3.58k | command_line_container.reserve(argc); |
89 | | |
90 | 3.58k | std::vector<const char*> argv; |
91 | 3.58k | argv.reserve(argc); |
92 | | |
93 | 847k | for (int i = 0; i < argc; i++) |
94 | 844k | { |
95 | 844k | command_line_container.push_back( |
96 | 844k | provider.ConsumeRandomLengthString(kMaxArgSize)); |
97 | 844k | argv.push_back(command_line_container[i].c_str()); |
98 | 844k | } |
99 | | |
100 | | // Parse command line; |
101 | 3.58k | auto result = options.parse(argc, argv.data()); |
102 | 3.58k | } catch (...) |
103 | 3.84k | { |
104 | 772 | } |
105 | | |
106 | 3.84k | return 0; |
107 | 3.84k | } |