git repos / blockattack-game

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

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// A fuzzer for floating-point formatter.
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 <cstdlib>
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include <limits>
f8deb5b9 Poul Sander 2022-01-15 13:55 9
#include <stdexcept>
f8deb5b9 Poul Sander 2022-01-15 13:55 10
f8deb5b9 Poul Sander 2022-01-15 13:55 11
#include "fuzzer-common.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 12
f8deb5b9 Poul Sander 2022-01-15 13:55 13
void check_round_trip(fmt::string_view format_str, double value) {
f8deb5b9 Poul Sander 2022-01-15 13:55 14
  auto buffer = fmt::memory_buffer();
f8deb5b9 Poul Sander 2022-01-15 13:55 15
  fmt::format_to(std::back_inserter(buffer), format_str, value);
f8deb5b9 Poul Sander 2022-01-15 13:55 16
f8deb5b9 Poul Sander 2022-01-15 13:55 17
  if (std::isnan(value)) {
f8deb5b9 Poul Sander 2022-01-15 13:55 18
    auto nan = std::signbit(value) ? "-nan" : "nan";
f8deb5b9 Poul Sander 2022-01-15 13:55 19
    if (fmt::string_view(buffer.data(), buffer.size()) != nan)
f8deb5b9 Poul Sander 2022-01-15 13:55 20
      throw std::runtime_error("round trip failure");
f8deb5b9 Poul Sander 2022-01-15 13:55 21
    return;
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
  buffer.push_back('\0');
f8deb5b9 Poul Sander 2022-01-15 13:55 25
  char* ptr = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  if (std::strtod(buffer.data(), &ptr) != value)
f8deb5b9 Poul Sander 2022-01-15 13:55 27
    throw std::runtime_error("round trip failure");
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  if (ptr + 1 != buffer.end()) throw std::runtime_error("unparsed output");
f8deb5b9 Poul Sander 2022-01-15 13:55 29
}
f8deb5b9 Poul Sander 2022-01-15 13:55 30
f8deb5b9 Poul Sander 2022-01-15 13:55 31
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
f8deb5b9 Poul Sander 2022-01-15 13:55 32
  if (size <= sizeof(double) || !std::numeric_limits<double>::is_iec559)
f8deb5b9 Poul Sander 2022-01-15 13:55 33
    return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 34
  check_round_trip("{}", assign_from_buf<double>(data));
f8deb5b9 Poul Sander 2022-01-15 13:55 35
  // A larger than necessary precision is used to trigger the fallback
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  // formatter.
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  check_round_trip("{:.50g}", assign_from_buf<double>(data));
f8deb5b9 Poul Sander 2022-01-15 13:55 38
  return 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 39
}
1970-01-01 00:00 40