Use FuzzedDataProvider to generate these inputs. You MUST declare it in LLVMFuzzerTestOneInput, like this:
FuzzedDataProvider stream(data, size);
Include #include in the solution.
This code shows example of using it:
// Extract integral values
int int_arg = stream.ConsumeIntegral();
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_arg_in_range = stream.ConsumeFloatingPointInRange(-1.0, 1.0);
// Extract value from predefined set, such as enum or array
EnumType enum = stream.ConsumeEnum();
int valid_values = stream.PickValueInArray({FLAG_1, FLAG_2, FLAG_3});
// Extract an array of bytes as a vector. You MUST call .data() to use result as pointer.
std::vector bytes = stream.ConsumeBytes(stream.ConsumeIntegralInRange(0, max_size));
void *data_ptr = bytes.data();
std::vector bytes2 = stream.ConsumeBytes(requested_size);
void *data2_ptr = bytes2.data();
// Extract a string. You MUST use .c_str() 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));
There MUST be AT MOST ONE call to ConsumeRemainingBytes to consume remaining input!
FuzzedDataProvider stream(data, size);
std::vector bytes3 = stream.ConsumeRemainingBytes();
void *data3_ptr = bytes3.data();