13 #ifndef LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
14 #define LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
22 #include <initializer_list>
25 #include <type_traits>
46 template <
typename T> std::vector<T>
ConsumeBytes(
size_t num_bytes);
76 template <
typename T,
size_t size>
81 size_t ConsumeData(
void *destination,
size_t num_bytes);
95 std::vector<T>
ConsumeBytes(
size_t size,
size_t num_bytes);
107 template <
typename T>
110 return ConsumeBytes<T>(num_bytes, num_bytes);
117 template <
typename T>
121 std::vector<T> result = ConsumeBytes<T>(num_bytes + 1, num_bytes);
122 result.back() = terminator;
127 template <
typename T>
137 static_assert(
sizeof(std::string::value_type) ==
sizeof(uint8_t),
138 "ConsumeBytesAsString cannot convert the data to a string.");
142 reinterpret_cast<const std::string::value_type *
>(
data_ptr_), num_bytes);
164 char next = ConvertUnsignedToSigned<char>(
data_ptr_[0]);
167 next = ConvertUnsignedToSigned<char>(
data_ptr_[0]);
175 result.shrink_to_fit();
196 std::numeric_limits<T>::max());
203 template <
typename T>
205 static_assert(std::is_integral<T>::value,
"An integral type is required.");
206 static_assert(
sizeof(
T) <=
sizeof(uint64_t),
"Unsupported integral type.");
212 uint64_t range =
static_cast<uint64_t
>(max) - min;
216 while (offset <
sizeof(
T) * CHAR_BIT && (range >> offset) > 0 &&
230 if (range != std::numeric_limits<decltype(range)>::max())
231 result = result % (range + 1);
233 return static_cast<T>(min + result);
240 return ConsumeFloatingPointInRange<T>(std::numeric_limits<T>::lowest(),
241 std::numeric_limits<T>::max());
247 template <
typename T>
254 constexpr
T zero(.0);
255 if (max > zero && min < zero && max > min + std::numeric_limits<T>::max()) {
259 range = (max / 2.0) - (min / 2.0);
267 return result + range * ConsumeProbability<T>();
273 static_assert(std::is_floating_point<T>::value,
274 "A floating point type is required.");
279 typename std::conditional<(
sizeof(
T) <=
sizeof(uint32_t)), uint32_t,
282 T result =
static_cast<T>(ConsumeIntegral<IntegralType>());
283 result /=
static_cast<T>(std::numeric_limits<IntegralType>::max());
289 return 1 & ConsumeIntegral<uint8_t>();
296 static_assert(std::is_enum<T>::value,
"|T| must be an enum type.");
297 return static_cast<T>(
298 ConsumeIntegralInRange<uint32_t>(0,
static_cast<uint32_t
>(T::kMaxValue)));
302 template <
typename T,
size_t size>
304 static_assert(size > 0,
"The array must be non empty.");
305 return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
308 template <
typename T,
size_t size>
310 static_assert(size > 0,
"The array must be non empty.");
311 return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
314 template <
typename T>
320 return *(list.begin() + ConsumeIntegralInRange<size_t>(0, list.size() - 1));
339 std::memcpy(destination,
data_ptr_, num_bytes);
351 template <
typename T>
353 static_assert(
sizeof(
T) ==
sizeof(uint8_t),
"Incompatible data type.");
361 std::vector<T> result(size);
373 result.shrink_to_fit();
377 template <
typename TS,
typename TU>
379 static_assert(
sizeof(TS) ==
sizeof(TU),
"Incompatible data types.");
380 static_assert(!std::numeric_limits<TU>::is_signed,
381 "Source type must be unsigned.");
384 if (std::numeric_limits<TS>::is_modulo)
385 return static_cast<TS
>(value);
389 if (value <= std::numeric_limits<TS>::max()) {
390 return static_cast<TS
>(value);
392 constexpr
auto TS_min = std::numeric_limits<TS>::min();
393 return TS_min +
static_cast<char>(value - TS_min);
void Advance(size_t num_bytes)
std::vector< T > ConsumeBytesWithTerminator(size_t num_bytes, T terminator=0)
std::string ConsumeBytesAsString(size_t num_bytes)
std::vector< T > ConsumeBytes(size_t num_bytes)
T ConsumeIntegralInRange(T min, T max)
TS ConvertUnsignedToSigned(TU value)
const uint8_t * data_ptr_
size_t ConsumeData(void *destination, size_t num_bytes)
std::vector< T > ConsumeRemainingBytes()
T PickValueInArray(const T(&array)[size])
T ConsumeFloatingPointInRange(T min, T max)
std::string ConsumeRandomLengthString()
void CopyAndAdvance(void *destination, size_t num_bytes)
std::string ConsumeRemainingBytesAsString()
FuzzedDataProvider & operator=(const FuzzedDataProvider &)=delete
FuzzedDataProvider(const FuzzedDataProvider &)=delete
FuzzedDataProvider(const uint8_t *data, size_t size)
~FuzzedDataProvider()=default
#define T(expected, seed, data)