4db5723525
* add fuzzers for chrono timepoint and localtime,gmtime * reorder cases to improve throughput mutating the first byte of the input now always results in picking on of the two paths. Before, two of the four possible outcomes resulted in doit() not being invoked. * drop the localtime fuzzer * inline aliases * only fuzz std::chrono::system_clock
33 lines
828 B
C++
33 lines
828 B
C++
// Copyright (c) 2021, Paul Dreik
|
|
// For license information refer to format.h.
|
|
#include <fmt/chrono.h>
|
|
|
|
#include "fuzzer-common.h"
|
|
|
|
/*
|
|
* a fuzzer for the chrono timepoints formatters
|
|
* C is a clock (std::chrono::system_clock etc)
|
|
*/
|
|
template <typename C> void doit(const uint8_t* data, size_t size) {
|
|
using Rep = typename C::time_point::rep;
|
|
constexpr auto N = sizeof(Rep);
|
|
if (size < N) return;
|
|
|
|
const auto x = assign_from_buf<Rep>(data);
|
|
typename C::duration dur{x};
|
|
typename C::time_point timepoint{dur};
|
|
data += N;
|
|
size -= N;
|
|
data_to_string format_str(data, size);
|
|
|
|
std::string message = fmt::format(format_str.get(), timepoint);
|
|
}
|
|
|
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
|
try {
|
|
doit<std::chrono::system_clock>(data, size);
|
|
} catch (...) {
|
|
}
|
|
return 0;
|
|
}
|