git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-11.0.2/test/fuzzing/named-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 <type_traits>
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include <vector>
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 T>
f8deb5b9 Poul Sander 2022-01-15 13:55 13
void invoke_fmt(const uint8_t* data, size_t size, unsigned arg_name_size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 14
  static_assert(sizeof(T) <= fixed_size, "fixed_size too small");
f8deb5b9 Poul Sander 2022-01-15 13:55 15
  if (size <= fixed_size) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 16
  const T value = assign_from_buf<T>(data);
f8deb5b9 Poul Sander 2022-01-15 13:55 17
  data += fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 18
  size -= fixed_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 19
f8deb5b9 Poul Sander 2022-01-15 13:55 20
  if (arg_name_size <= 0 || arg_name_size >= size) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 21
  data_to_string arg_name(data, arg_name_size, true);
f8deb5b9 Poul Sander 2022-01-15 13:55 22
  data += arg_name_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 23
  size -= arg_name_size;
f8deb5b9 Poul Sander 2022-01-15 13:55 24
f8deb5b9 Poul Sander 2022-01-15 13:55 25
  data_to_string format_str(data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  try {
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 =
f8deb5b9 Poul Sander 2022-01-15 13:55 29
        fmt::format(format_str.get(), fmt::arg(arg_name.data(), value));
f8deb5b9 Poul Sander 2022-01-15 13:55 30
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 31
    fmt::memory_buffer out;
f8deb5b9 Poul Sander 2022-01-15 13:55 32
    fmt::format_to(std::back_inserter(out), format_str.get(),
f8deb5b9 Poul Sander 2022-01-15 13:55 33
                   fmt::arg(arg_name.data(), value));
f8deb5b9 Poul Sander 2022-01-15 13:55 34
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 35
  } catch (std::exception&) {
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  }
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
// For dynamic dispatching to an explicit instantiation.
f8deb5b9 Poul Sander 2022-01-15 13:55 40
template <typename Callback> void invoke(int type, Callback callback) {
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  switch (type) {
f8deb5b9 Poul Sander 2022-01-15 13:55 42
  case 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 43
    callback(bool());
f8deb5b9 Poul Sander 2022-01-15 13:55 44
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 45
  case 1:
f8deb5b9 Poul Sander 2022-01-15 13:55 46
    callback(char());
f8deb5b9 Poul Sander 2022-01-15 13:55 47
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 48
  case 2:
f8deb5b9 Poul Sander 2022-01-15 13:55 49
    using sc = signed char;
f8deb5b9 Poul Sander 2022-01-15 13:55 50
    callback(sc());
f8deb5b9 Poul Sander 2022-01-15 13:55 51
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 52
  case 3:
f8deb5b9 Poul Sander 2022-01-15 13:55 53
    using uc = unsigned char;
f8deb5b9 Poul Sander 2022-01-15 13:55 54
    callback(uc());
f8deb5b9 Poul Sander 2022-01-15 13:55 55
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 56
  case 4:
f8deb5b9 Poul Sander 2022-01-15 13:55 57
    callback(short());
f8deb5b9 Poul Sander 2022-01-15 13:55 58
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  case 5:
f8deb5b9 Poul Sander 2022-01-15 13:55 60
    using us = unsigned short;
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    callback(us());
f8deb5b9 Poul Sander 2022-01-15 13:55 62
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 63
  case 6:
f8deb5b9 Poul Sander 2022-01-15 13:55 64
    callback(int());
f8deb5b9 Poul Sander 2022-01-15 13:55 65
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 66
  case 7:
f8deb5b9 Poul Sander 2022-01-15 13:55 67
    callback(unsigned());
f8deb5b9 Poul Sander 2022-01-15 13:55 68
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 69
  case 8:
f8deb5b9 Poul Sander 2022-01-15 13:55 70
    callback(long());
f8deb5b9 Poul Sander 2022-01-15 13:55 71
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 72
  case 9:
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    using ul = unsigned long;
f8deb5b9 Poul Sander 2022-01-15 13:55 74
    callback(ul());
f8deb5b9 Poul Sander 2022-01-15 13:55 75
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 76
  case 10:
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    callback(float());
f8deb5b9 Poul Sander 2022-01-15 13:55 78
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 79
  case 11:
f8deb5b9 Poul Sander 2022-01-15 13:55 80
    callback(double());
f8deb5b9 Poul Sander 2022-01-15 13:55 81
    break;
f8deb5b9 Poul Sander 2022-01-15 13:55 82
  case 12:
f8deb5b9 Poul Sander 2022-01-15 13:55 83
    using LD = long double;
f8deb5b9 Poul Sander 2022-01-15 13:55 84
    callback(LD());
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 type = data[0] & 0x0F;
f8deb5b9 Poul Sander 2022-01-15 13:55 94
  const unsigned arg_name_size = (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
f8deb5b9 Poul Sander 2022-01-15 13:55 98
  invoke(type, [=](auto arg) {
f8deb5b9 Poul Sander 2022-01-15 13:55 99
    invoke_fmt<decltype(arg)>(data, size, arg_name_size);
f8deb5b9 Poul Sander 2022-01-15 13:55 100
  });
f8deb5b9 Poul Sander 2022-01-15 13:55 101
  return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 102
}
1970-01-01 00:00 103