1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- // Copyright (c) 2019, Paul Dreik
- // For the license information refer to format.h.
- #include <fmt/chrono.h>
- #include <cstdint>
- #include <exception>
- #include "fuzzer-common.h"
- template <typename T, typename Repr> const T* from_repr(const Repr& r) {
- return &r;
- }
- template <> const std::tm* from_repr<std::tm>(const std::time_t& t) {
- return std::localtime(&t);
- }
- template <typename T, typename Repr = T>
- void invoke_fmt(const uint8_t* data, size_t size) {
- static_assert(sizeof(Repr) <= fixed_size, "Nfixed is too small");
- if (size <= fixed_size) return;
- auto repr = assign_from_buf<Repr>(data);
- const T* value = from_repr<T>(repr);
- if (!value) return;
- data += fixed_size;
- size -= fixed_size;
- data_to_string format_str(data, size);
- try {
- #if FMT_FUZZ_FORMAT_TO_STRING
- std::string message = fmt::format(format_str.get(), *value);
- #else
- auto buf = fmt::memory_buffer();
- fmt::format_to(std::back_inserter(buf), format_str.get(), *value);
- #endif
- } catch (std::exception&) {
- }
- }
- extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- if (size <= 3) return 0;
- const auto first = data[0];
- data++;
- size--;
- switch (first) {
- case 0:
- invoke_fmt<bool>(data, size);
- break;
- case 1:
- invoke_fmt<char>(data, size);
- break;
- case 2:
- invoke_fmt<unsigned char>(data, size);
- break;
- case 3:
- invoke_fmt<signed char>(data, size);
- break;
- case 4:
- invoke_fmt<short>(data, size);
- break;
- case 5:
- invoke_fmt<unsigned short>(data, size);
- break;
- case 6:
- invoke_fmt<int>(data, size);
- break;
- case 7:
- invoke_fmt<unsigned int>(data, size);
- break;
- case 8:
- invoke_fmt<long>(data, size);
- break;
- case 9:
- invoke_fmt<unsigned long>(data, size);
- break;
- case 10:
- invoke_fmt<float>(data, size);
- break;
- case 11:
- invoke_fmt<double>(data, size);
- break;
- case 12:
- invoke_fmt<long double>(data, size);
- break;
- case 13:
- invoke_fmt<std::tm, std::time_t>(data, size);
- break;
- }
- return 0;
- }
|