Coverage Report

Created: 2026-01-17 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fmt/test/fuzzing/float.cc
Line
Count
Source
1
// A fuzzer for floating-point formatter.
2
// For the license information refer to format.h.
3
4
#include <fmt/format.h>
5
6
#include <cstdint>
7
#include <cstdlib>
8
#include <limits>
9
#include <stdexcept>
10
11
#include "fuzzer-common.h"
12
13
2.12k
void check_round_trip(fmt::string_view format_str, double value) {
14
2.12k
  auto buffer = fmt::memory_buffer();
15
2.12k
  fmt::format_to(std::back_inserter(buffer), format_str, value);
16
17
2.12k
  if (std::isnan(value)) {
18
182
    auto nan = std::signbit(value) ? "-nan" : "nan";
19
182
    if (fmt::string_view(buffer.data(), buffer.size()) != nan)
20
0
      throw std::runtime_error("round trip failure");
21
182
    return;
22
182
  }
23
24
1.94k
  buffer.push_back('\0');
25
1.94k
  char* ptr = nullptr;
26
1.94k
  if (std::strtod(buffer.data(), &ptr) != value)
27
0
    throw std::runtime_error("round trip failure");
28
1.94k
  if (ptr + 1 != buffer.end()) throw std::runtime_error("unparsed output");
29
1.94k
}
30
31
1.06k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
32
1.06k
  if (size <= sizeof(double) || !std::numeric_limits<double>::is_iec559)
33
5
    return 0;
34
1.06k
  check_round_trip("{}", assign_from_buf<double>(data));
35
  // A larger than necessary precision is used to trigger the fallback
36
  // formatter.
37
1.06k
  check_round_trip("{:.50g}", assign_from_buf<double>(data));
38
1.06k
  return 0;
39
1.06k
}