
Use <code>FuzzedDataProvider</code> to generate these inputs. You MUST declare it in <code>LLVMFuzzerTestOneInput</code>, like this:
<code>
FuzzedDataProvider stream(data, size);
</code>

Include <code>#include <fuzzer/FuzzedDataProvider.h></code> in the solution.

This code shows example of using it:
<code>
// Extract integral values
int int_arg = stream.ConsumeIntegral<int>();
int int_arg_in_range = stream.ConsumeIntegralInRange(-100, 100);
bool bool_arg = stream.ConsumeBool();

// Extract floating point values
float probability = stream.ConsumeProbability();
double double_arg = stream.ConsumeFloatingPoint<double>();
double double_arg_in_range = stream.ConsumeFloatingPointInRange(-1.0, 1.0);

// Extract value from predefined set, such as enum or array
EnumType enum = stream.ConsumeEnum<EnumType>();
int valid_values = stream.PickValueInArray({FLAG_1, FLAG_2, FLAG_3});

// Extract an array of bytes as a vector. You MUST call <code>.data()</code> to use result as pointer.
std::vector<uint8_t> bytes = stream.ConsumeBytes<uint8_t>(stream.ConsumeIntegralInRange(0, max_size));
void *data_ptr = bytes.data();
std::vector<uint8_t> bytes2 = stream.ConsumeBytes<uint8_t>(requested_size);
void *data2_ptr = bytes2.data();

// Extract a string. You MUST use <code>.c_str()</code> to use result as pointer
std::string str = stream.ConsumeBytesAsString(stream.ConsumeIntegralInRange(0, max_size));
char *ptr = str.c_str();
std::string str2 = stream.ConsumeBytesAsString(requested_size);
char *ptr2 = str2.c_str();
std::string str3 = stream.ConsumeRandomLengthString();
char *ptr3 = str3.c_str();

// Extract to user defined object
struct_type_t obj;
size_t consumed = stream.ConsumeData(&obj, sizeof(obj));
</code>

There MUST be AT MOST ONE call to <code>ConsumeRemainingBytes</code> to consume remaining input!
<code>
FuzzedDataProvider stream(data, size);

std::vector<uint8_t> bytes3 = stream.ConsumeRemainingBytes();
void *data3_ptr = bytes3.data();
</code>
