mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-26 04:00:05 +00:00
Fuzz fallback formatter
This commit is contained in:
parent
6b7bfed40c
commit
49544ea943
@ -9,26 +9,31 @@
|
||||
|
||||
#include "fuzzer-common.h"
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||||
if (size <= sizeof(double) || !std::numeric_limits<double>::is_iec559)
|
||||
return 0;
|
||||
|
||||
auto value = assign_from_buf<double>(data);
|
||||
void check_round_trip(fmt::string_view format_str, double value) {
|
||||
auto buffer = fmt::memory_buffer();
|
||||
fmt::format_to(buffer, "{}", value);
|
||||
fmt::format_to(buffer, format_str, value);
|
||||
|
||||
// Check a round trip.
|
||||
if (std::isnan(value)) {
|
||||
auto nan = std::signbit(value) ? "-nan" : "nan";
|
||||
if (fmt::string_view(buffer.data(), buffer.size()) != nan)
|
||||
throw std::runtime_error("round trip failure");
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
buffer.push_back('\0');
|
||||
char* ptr = nullptr;
|
||||
if (std::strtod(buffer.data(), &ptr) != value)
|
||||
throw std::runtime_error("round trip failure");
|
||||
if (ptr + 1 != buffer.end())
|
||||
throw std::runtime_error("unparsed output");
|
||||
}
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||||
if (size <= sizeof(double) || !std::numeric_limits<double>::is_iec559)
|
||||
return 0;
|
||||
check_round_trip("{}", assign_from_buf<double>(data));
|
||||
// A larger than necessary precision is used to trigger the fallback
|
||||
// formatter.
|
||||
check_round_trip("{:.50g}", assign_from_buf<double>(data));
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user