git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-11.0.2/test/fuzzing/one-arg.cc

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Copyright (c) 2019, Paul Dreik
f8deb5b9 Poul Sander 2022-01-15 13:55 2
// For the license information refer to format.h.
f8deb5b9 Poul Sander 2022-01-15 13:55 3
f8deb5b9 Poul Sander 2022-01-15 13:55 4
#include <fmt/chrono.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 5
f8deb5b9 Poul Sander 2022-01-15 13:55 6
#include <cstdint>
f8deb5b9 Poul Sander 2022-01-15 13:55 7
#include <exception>
f8deb5b9 Poul Sander 2022-01-15 13:55 8
f8deb5b9 Poul Sander 2022-01-15 13:55 9
#include "fuzzer-common.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 10
f8deb5b9 Poul Sander 2022-01-15 13:55 11
template <typename T, typename Repr> const T* from_repr(const Repr& r) {
f8deb5b9 Poul Sander 2022-01-15 13:55 12
  return &r;
f8deb5b9 Poul Sander 2022-01-15 13:55 13
}
f8deb5b9 Poul Sander 2022-01-15 13:55 14
f8deb5b9 Poul Sander 2022-01-15 13:55 15
template <> const std::tm* from_repr<std::tm>(const std::time_t& t) {
f8deb5b9 Poul Sander 2022-01-15 13:55 16
  return std::localtime(&t);
f8deb5b9 Poul Sander 2022-01-15 13:55 17
}
f8deb5b9 Poul Sander 2022-01-15 13:55 18
f8deb5b9 Poul Sander 2022-01-15 13:55 19
template <typename T, typename Repr = T>
f8deb5b9 Poul Sander 2022-01-15 13:55 20
void invoke_fmt(const uint8_t* data, size_t size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 21
  static_assert(sizeof(Repr) <= fixed_size, "Nfixed is too small");
f8deb5b9 Poul Sander 2022-01-15 13:55 22
  if (size <= fixed_size) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 23
  auto repr = assign_from_buf<Repr>(data);
f8deb5b9 Poul Sander 2022-01-15 13:55 24
  const T* value = from_repr<T>(repr);
f8deb5b9 Poul Sander 2022-01-15 13:55 25
  if (!value) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  data += fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 27
  size -= fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  data_to_string format_str(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 29
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 30
#if FMT_FUZZ_FORMAT_TO_STRING
f8deb5b9 Poul Sander 2022-01-15 13:55 31
    std::string message = fmt::format(format_str.get(), *value);
f8deb5b9 Poul Sander 2022-01-15 13:55 32
#else
47fd5c32 Poul Sander 2024-10-05 08:44 33
    auto buf = fmt::memory_buffer();
47fd5c32 Poul Sander 2024-10-05 08:44 34
    fmt::format_to(std::back_inserter(buf), format_str.get(), *value);
f8deb5b9 Poul Sander 2022-01-15 13:55 35
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  } catch (std::exception&) {
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 38
}
f8deb5b9 Poul Sander 2022-01-15 13:55 39
f8deb5b9 Poul Sander 2022-01-15 13:55 40
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  if (size <= 3) return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 42
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  const auto first = data[0];
f8deb5b9 Poul Sander 2022-01-15 13:55 44
  data++;
f8deb5b9 Poul Sander 2022-01-15 13:55 45
  size--;
f8deb5b9 Poul Sander 2022-01-15 13:55 46
f8deb5b9 Poul Sander 2022-01-15 13:55 47
  switch (first) {
f8deb5b9 Poul Sander 2022-01-15 13:55 48
  case 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 49
    invoke_fmt<bool>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 50
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 51
  case 1:
f8deb5b9 Poul Sander 2022-01-15 13:55 52
    invoke_fmt<char>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 53
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 54
  case 2:
f8deb5b9 Poul Sander 2022-01-15 13:55 55
    invoke_fmt<unsigned char>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 56
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  case 3:
f8deb5b9 Poul Sander 2022-01-15 13:55 58
    invoke_fmt<signed char>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 59
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 60
  case 4:
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    invoke_fmt<short>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 62
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 63
  case 5:
f8deb5b9 Poul Sander 2022-01-15 13:55 64
    invoke_fmt<unsigned short>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 65
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 66
  case 6:
f8deb5b9 Poul Sander 2022-01-15 13:55 67
    invoke_fmt<int>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 68
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 69
  case 7:
f8deb5b9 Poul Sander 2022-01-15 13:55 70
    invoke_fmt<unsigned int>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 71
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 72
  case 8:
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    invoke_fmt<long>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 74
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 75
  case 9:
f8deb5b9 Poul Sander 2022-01-15 13:55 76
    invoke_fmt<unsigned long>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 78
  case 10:
f8deb5b9 Poul Sander 2022-01-15 13:55 79
    invoke_fmt<float>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 80
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 81
  case 11:
f8deb5b9 Poul Sander 2022-01-15 13:55 82
    invoke_fmt<double>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 83
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 84
  case 12:
f8deb5b9 Poul Sander 2022-01-15 13:55 85
    invoke_fmt<long double>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 86
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 87
  case 13:
f8deb5b9 Poul Sander 2022-01-15 13:55 88
    invoke_fmt<std::tm, std::time_t>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 89
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 90
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 91
  return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 92
}
1970-01-01 00:00 93