git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/test/fuzzing/fuzzer-common.h

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
#ifndef FUZZER_COMMON_H
f8deb5b9 Poul Sander 2022-01-15 13:55 5
#define FUZZER_COMMON_H
f8deb5b9 Poul Sander 2022-01-15 13:55 6
f8deb5b9 Poul Sander 2022-01-15 13:55 7
#include <fmt/core.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 8
f8deb5b9 Poul Sander 2022-01-15 13:55 9
#include <cstdint>  // std::uint8_t
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#include <cstring>  // memcpy
f8deb5b9 Poul Sander 2022-01-15 13:55 11
#include <vector>
f8deb5b9 Poul Sander 2022-01-15 13:55 12
f8deb5b9 Poul Sander 2022-01-15 13:55 13
// One can format to either a string, or a buffer. The latter is faster, but
f8deb5b9 Poul Sander 2022-01-15 13:55 14
// one may be interested in formatting to a string instead to verify it works
f8deb5b9 Poul Sander 2022-01-15 13:55 15
// as intended. To avoid a combinatoric explosion, select this at compile time
f8deb5b9 Poul Sander 2022-01-15 13:55 16
// instead of dynamically from the fuzz data.
f8deb5b9 Poul Sander 2022-01-15 13:55 17
#define FMT_FUZZ_FORMAT_TO_STRING 0
f8deb5b9 Poul Sander 2022-01-15 13:55 18
f8deb5b9 Poul Sander 2022-01-15 13:55 19
// If {fmt} is given a buffer that is separately allocated, chances that address
f8deb5b9 Poul Sander 2022-01-15 13:55 20
// sanitizer detects out of bound reads is much higher. However, it slows down
f8deb5b9 Poul Sander 2022-01-15 13:55 21
// the fuzzing.
f8deb5b9 Poul Sander 2022-01-15 13:55 22
#define FMT_FUZZ_SEPARATE_ALLOCATION 1
f8deb5b9 Poul Sander 2022-01-15 13:55 23
f8deb5b9 Poul Sander 2022-01-15 13:55 24
// The size of the largest possible type in use.
f8deb5b9 Poul Sander 2022-01-15 13:55 25
// To let the the fuzzer mutation be efficient at cross pollinating between
f8deb5b9 Poul Sander 2022-01-15 13:55 26
// different types, use a fixed size format. The same bit pattern, interpreted
f8deb5b9 Poul Sander 2022-01-15 13:55 27
// as another type, is likely interesting.
f8deb5b9 Poul Sander 2022-01-15 13:55 28
constexpr auto fixed_size = 16;
f8deb5b9 Poul Sander 2022-01-15 13:55 29
f8deb5b9 Poul Sander 2022-01-15 13:55 30
// Casts data to a char pointer.
f8deb5b9 Poul Sander 2022-01-15 13:55 31
template <typename T> inline const char* as_chars(const T* data) {
f8deb5b9 Poul Sander 2022-01-15 13:55 32
  return reinterpret_cast<const char*>(data);
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
// Casts data to a byte pointer.
f8deb5b9 Poul Sander 2022-01-15 13:55 36
template <typename T> inline const std::uint8_t* as_bytes(const T* data) {
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  return reinterpret_cast<const std::uint8_t*>(data);
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
// Blits bytes from data to form an (assumed trivially constructible) object
f8deb5b9 Poul Sander 2022-01-15 13:55 41
// of type Item.
f8deb5b9 Poul Sander 2022-01-15 13:55 42
template <class Item> inline Item assign_from_buf(const std::uint8_t* data) {
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  auto item = Item();
f8deb5b9 Poul Sander 2022-01-15 13:55 44
  std::memcpy(&item, data, sizeof(Item));
f8deb5b9 Poul Sander 2022-01-15 13:55 45
  return item;
f8deb5b9 Poul Sander 2022-01-15 13:55 46
}
f8deb5b9 Poul Sander 2022-01-15 13:55 47
f8deb5b9 Poul Sander 2022-01-15 13:55 48
// Reads a boolean value by looking at the first byte from data.
f8deb5b9 Poul Sander 2022-01-15 13:55 49
template <> inline bool assign_from_buf<bool>(const std::uint8_t* data) {
f8deb5b9 Poul Sander 2022-01-15 13:55 50
  return *data != 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 51
}
f8deb5b9 Poul Sander 2022-01-15 13:55 52
f8deb5b9 Poul Sander 2022-01-15 13:55 53
struct data_to_string {
f8deb5b9 Poul Sander 2022-01-15 13:55 54
#if FMT_FUZZ_SEPARATE_ALLOCATION
f8deb5b9 Poul Sander 2022-01-15 13:55 55
  std::vector<char> buffer;
f8deb5b9 Poul Sander 2022-01-15 13:55 56
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  data_to_string(const uint8_t* data, size_t size, bool add_terminator = false)
f8deb5b9 Poul Sander 2022-01-15 13:55 58
      : buffer(size + (add_terminator ? 1 : 0)) {
f8deb5b9 Poul Sander 2022-01-15 13:55 59
    if (size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 60
      std::memcpy(buffer.data(), data, size);
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 62
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 63
f8deb5b9 Poul Sander 2022-01-15 13:55 64
  fmt::string_view get() const { return {buffer.data(), buffer.size()}; }
f8deb5b9 Poul Sander 2022-01-15 13:55 65
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 66
  fmt::string_view sv;
f8deb5b9 Poul Sander 2022-01-15 13:55 67
f8deb5b9 Poul Sander 2022-01-15 13:55 68
  data_to_string(const uint8_t* data, size_t size, bool = false)
f8deb5b9 Poul Sander 2022-01-15 13:55 69
      : str(as_chars(data), size) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 70
f8deb5b9 Poul Sander 2022-01-15 13:55 71
  fmt::string_view get() const { return sv; }
f8deb5b9 Poul Sander 2022-01-15 13:55 72
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 73
f8deb5b9 Poul Sander 2022-01-15 13:55 74
  const char* data() const { return get().data(); }
f8deb5b9 Poul Sander 2022-01-15 13:55 75
};
f8deb5b9 Poul Sander 2022-01-15 13:55 76
f8deb5b9 Poul Sander 2022-01-15 13:55 77
#endif  // FUZZER_COMMON_H
1970-01-01 00:00 78