git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/test/fuzzing/chrono-duration.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
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include "fuzzer-common.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
template <typename Period, typename Rep>
f8deb5b9 Poul Sander 2022-01-15 13:55 11
void invoke_inner(fmt::string_view format_str, Rep rep) {
f8deb5b9 Poul Sander 2022-01-15 13:55 12
  auto value = std::chrono::duration<Rep, Period>(rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 13
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 14
#if FMT_FUZZ_FORMAT_TO_STRING
f8deb5b9 Poul Sander 2022-01-15 13:55 15
    std::string message = fmt::format(format_str, value);
f8deb5b9 Poul Sander 2022-01-15 13:55 16
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 17
    auto buf = fmt::memory_buffer();
f8deb5b9 Poul Sander 2022-01-15 13:55 18
    fmt::format_to(std::back_inserter(buf), format_str, value);
f8deb5b9 Poul Sander 2022-01-15 13:55 19
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 20
  } catch (std::exception&) {
f8deb5b9 Poul Sander 2022-01-15 13:55 21
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 22
}
f8deb5b9 Poul Sander 2022-01-15 13:55 23
f8deb5b9 Poul Sander 2022-01-15 13:55 24
// Rep is a duration's representation type.
f8deb5b9 Poul Sander 2022-01-15 13:55 25
template <typename Rep>
f8deb5b9 Poul Sander 2022-01-15 13:55 26
void invoke_outer(const uint8_t* data, size_t size, int period) {
f8deb5b9 Poul Sander 2022-01-15 13:55 27
  // Always use a fixed location of the data.
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  static_assert(sizeof(Rep) <= fixed_size, "fixed size is too small");
f8deb5b9 Poul Sander 2022-01-15 13:55 29
  if (size <= fixed_size + 1) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 30
f8deb5b9 Poul Sander 2022-01-15 13:55 31
  const Rep rep = assign_from_buf<Rep>(data);
f8deb5b9 Poul Sander 2022-01-15 13:55 32
  data += fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 33
  size -= fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 34
f8deb5b9 Poul Sander 2022-01-15 13:55 35
  // data is already allocated separately in libFuzzer so reading past the end
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  // will most likely be detected anyway.
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  const auto format_str = fmt::string_view(as_chars(data), size);
f8deb5b9 Poul Sander 2022-01-15 13:55 38
f8deb5b9 Poul Sander 2022-01-15 13:55 39
  // yocto, zepto, zetta and yotta are not handled.
f8deb5b9 Poul Sander 2022-01-15 13:55 40
  switch (period) {
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  case 1:
f8deb5b9 Poul Sander 2022-01-15 13:55 42
    invoke_inner<std::atto>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 43
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 44
  case 2:
f8deb5b9 Poul Sander 2022-01-15 13:55 45
    invoke_inner<std::femto>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 46
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 47
  case 3:
f8deb5b9 Poul Sander 2022-01-15 13:55 48
    invoke_inner<std::pico>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 49
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 50
  case 4:
f8deb5b9 Poul Sander 2022-01-15 13:55 51
    invoke_inner<std::nano>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 52
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 53
  case 5:
f8deb5b9 Poul Sander 2022-01-15 13:55 54
    invoke_inner<std::micro>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 55
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 56
  case 6:
f8deb5b9 Poul Sander 2022-01-15 13:55 57
    invoke_inner<std::milli>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 58
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  case 7:
f8deb5b9 Poul Sander 2022-01-15 13:55 60
    invoke_inner<std::centi>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 62
  case 8:
f8deb5b9 Poul Sander 2022-01-15 13:55 63
    invoke_inner<std::deci>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 64
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 65
  case 9:
f8deb5b9 Poul Sander 2022-01-15 13:55 66
    invoke_inner<std::deca>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 67
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 68
  case 10:
f8deb5b9 Poul Sander 2022-01-15 13:55 69
    invoke_inner<std::kilo>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 70
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 71
  case 11:
f8deb5b9 Poul Sander 2022-01-15 13:55 72
    invoke_inner<std::mega>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 74
  case 12:
f8deb5b9 Poul Sander 2022-01-15 13:55 75
    invoke_inner<std::giga>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 76
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 77
  case 13:
f8deb5b9 Poul Sander 2022-01-15 13:55 78
    invoke_inner<std::tera>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 79
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 80
  case 14:
f8deb5b9 Poul Sander 2022-01-15 13:55 81
    invoke_inner<std::peta>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 82
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 83
  case 15:
f8deb5b9 Poul Sander 2022-01-15 13:55 84
    invoke_inner<std::exa>(format_str, rep);
f8deb5b9 Poul Sander 2022-01-15 13:55 85
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 86
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 87
}
f8deb5b9 Poul Sander 2022-01-15 13:55 88
f8deb5b9 Poul Sander 2022-01-15 13:55 89
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 90
  if (size <= 4) return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 91
f8deb5b9 Poul Sander 2022-01-15 13:55 92
  const auto representation = data[0];
f8deb5b9 Poul Sander 2022-01-15 13:55 93
  const auto period = data[1];
f8deb5b9 Poul Sander 2022-01-15 13:55 94
  data += 2;
f8deb5b9 Poul Sander 2022-01-15 13:55 95
  size -= 2;
f8deb5b9 Poul Sander 2022-01-15 13:55 96
f8deb5b9 Poul Sander 2022-01-15 13:55 97
  switch (representation) {
f8deb5b9 Poul Sander 2022-01-15 13:55 98
  case 1:
f8deb5b9 Poul Sander 2022-01-15 13:55 99
    invoke_outer<char>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 100
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 101
  case 2:
f8deb5b9 Poul Sander 2022-01-15 13:55 102
    invoke_outer<signed char>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 103
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 104
  case 3:
f8deb5b9 Poul Sander 2022-01-15 13:55 105
    invoke_outer<unsigned char>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 106
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 107
  case 4:
f8deb5b9 Poul Sander 2022-01-15 13:55 108
    invoke_outer<short>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 109
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 110
  case 5:
f8deb5b9 Poul Sander 2022-01-15 13:55 111
    invoke_outer<unsigned short>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 112
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 113
  case 6:
f8deb5b9 Poul Sander 2022-01-15 13:55 114
    invoke_outer<int>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 115
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 116
  case 7:
f8deb5b9 Poul Sander 2022-01-15 13:55 117
    invoke_outer<unsigned int>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 118
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 119
  case 8:
f8deb5b9 Poul Sander 2022-01-15 13:55 120
    invoke_outer<long>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 121
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 122
  case 9:
f8deb5b9 Poul Sander 2022-01-15 13:55 123
    invoke_outer<unsigned long>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 124
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 125
  case 10:
f8deb5b9 Poul Sander 2022-01-15 13:55 126
    invoke_outer<float>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 127
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 128
  case 11:
f8deb5b9 Poul Sander 2022-01-15 13:55 129
    invoke_outer<double>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 130
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 131
  case 12:
f8deb5b9 Poul Sander 2022-01-15 13:55 132
    invoke_outer<long double>(data, size, period);
f8deb5b9 Poul Sander 2022-01-15 13:55 133
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 134
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 135
  return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 136
}
1970-01-01 00:00 137