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