git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/test/fuzzing/two-args.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/format.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
#include <string>
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#include "fuzzer-common.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 11
f8deb5b9 Poul Sander 2022-01-15 13:55 12
template <typename Item1, typename Item2>
f8deb5b9 Poul Sander 2022-01-15 13:55 13
void invoke_fmt(const uint8_t* data, size_t size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 14
  static_assert(sizeof(Item1) <= fixed_size, "size1 exceeded");
f8deb5b9 Poul Sander 2022-01-15 13:55 15
  static_assert(sizeof(Item2) <= fixed_size, "size2 exceeded");
f8deb5b9 Poul Sander 2022-01-15 13:55 16
  if (size <= fixed_size + fixed_size) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 17
f8deb5b9 Poul Sander 2022-01-15 13:55 18
  const Item1 item1 = assign_from_buf<Item1>(data);
f8deb5b9 Poul Sander 2022-01-15 13:55 19
  data += fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 20
  size -= fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 21
f8deb5b9 Poul Sander 2022-01-15 13:55 22
  const Item2 item2 = assign_from_buf<Item2>(data);
f8deb5b9 Poul Sander 2022-01-15 13:55 23
  data += fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 24
  size -= fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 25
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  auto format_str = fmt::string_view(as_chars(data), size);
f8deb5b9 Poul Sander 2022-01-15 13:55 27
#if FMT_FUZZ_FORMAT_TO_STRING
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  std::string message = fmt::format(format_str, item1, item2);
f8deb5b9 Poul Sander 2022-01-15 13:55 29
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 30
  fmt::memory_buffer message;
f8deb5b9 Poul Sander 2022-01-15 13:55 31
  fmt::format_to(message, format_str, item1, item2);
f8deb5b9 Poul Sander 2022-01-15 13:55 32
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 33
}
f8deb5b9 Poul Sander 2022-01-15 13:55 34
f8deb5b9 Poul Sander 2022-01-15 13:55 35
// For dynamic dispatching to an explicit instantiation.
f8deb5b9 Poul Sander 2022-01-15 13:55 36
template <typename Callback> void invoke(int index, Callback callback) {
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  switch (index) {
f8deb5b9 Poul Sander 2022-01-15 13:55 38
  case 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 39
    callback(bool());
f8deb5b9 Poul Sander 2022-01-15 13:55 40
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  case 1:
f8deb5b9 Poul Sander 2022-01-15 13:55 42
    callback(char());
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
    using sc = signed char;
f8deb5b9 Poul Sander 2022-01-15 13:55 46
    callback(sc());
f8deb5b9 Poul Sander 2022-01-15 13:55 47
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 48
  case 3:
f8deb5b9 Poul Sander 2022-01-15 13:55 49
    using uc = unsigned char;
f8deb5b9 Poul Sander 2022-01-15 13:55 50
    callback(uc());
f8deb5b9 Poul Sander 2022-01-15 13:55 51
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 52
  case 4:
f8deb5b9 Poul Sander 2022-01-15 13:55 53
    callback(short());
f8deb5b9 Poul Sander 2022-01-15 13:55 54
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 55
  case 5:
f8deb5b9 Poul Sander 2022-01-15 13:55 56
    using us = unsigned short;
f8deb5b9 Poul Sander 2022-01-15 13:55 57
    callback(us());
f8deb5b9 Poul Sander 2022-01-15 13:55 58
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  case 6:
f8deb5b9 Poul Sander 2022-01-15 13:55 60
    callback(int());
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 62
  case 7:
f8deb5b9 Poul Sander 2022-01-15 13:55 63
    callback(unsigned());
f8deb5b9 Poul Sander 2022-01-15 13:55 64
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 65
  case 8:
f8deb5b9 Poul Sander 2022-01-15 13:55 66
    callback(long());
f8deb5b9 Poul Sander 2022-01-15 13:55 67
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 68
  case 9:
f8deb5b9 Poul Sander 2022-01-15 13:55 69
    using ul = unsigned long;
f8deb5b9 Poul Sander 2022-01-15 13:55 70
    callback(ul());
f8deb5b9 Poul Sander 2022-01-15 13:55 71
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 72
  case 10:
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    callback(float());
f8deb5b9 Poul Sander 2022-01-15 13:55 74
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 75
  case 11:
f8deb5b9 Poul Sander 2022-01-15 13:55 76
    callback(double());
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 78
  case 12:
f8deb5b9 Poul Sander 2022-01-15 13:55 79
    using LD = long double;
f8deb5b9 Poul Sander 2022-01-15 13:55 80
    callback(LD());
f8deb5b9 Poul Sander 2022-01-15 13:55 81
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 82
  case 13:
f8deb5b9 Poul Sander 2022-01-15 13:55 83
    using ptr = void*;
f8deb5b9 Poul Sander 2022-01-15 13:55 84
    callback(ptr());
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 <= 3) return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 91
f8deb5b9 Poul Sander 2022-01-15 13:55 92
  // Switch types depending on the first byte of the input.
f8deb5b9 Poul Sander 2022-01-15 13:55 93
  const auto type1 = data[0] & 0x0F;
f8deb5b9 Poul Sander 2022-01-15 13:55 94
  const auto type2 = (data[0] & 0xF0) >> 4;
f8deb5b9 Poul Sander 2022-01-15 13:55 95
  data++;
f8deb5b9 Poul Sander 2022-01-15 13:55 96
  size--;
f8deb5b9 Poul Sander 2022-01-15 13:55 97
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 98
    invoke(type1, [=](auto param1) {
f8deb5b9 Poul Sander 2022-01-15 13:55 99
      invoke(type2, [=](auto param2) {
f8deb5b9 Poul Sander 2022-01-15 13:55 100
        invoke_fmt<decltype(param1), decltype(param2)>(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 101
      });
f8deb5b9 Poul Sander 2022-01-15 13:55 102
    });
f8deb5b9 Poul Sander 2022-01-15 13:55 103
  } catch (std::exception&) {
f8deb5b9 Poul Sander 2022-01-15 13:55 104
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 105
  return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 106
}
1970-01-01 00:00 107