summaryrefslogtreecommitdiffstats
path: root/src/fmt/test/fuzzing/chrono-timepoint.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fmt/test/fuzzing/chrono-timepoint.cc')
-rw-r--r--src/fmt/test/fuzzing/chrono-timepoint.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/fmt/test/fuzzing/chrono-timepoint.cc b/src/fmt/test/fuzzing/chrono-timepoint.cc
new file mode 100644
index 000000000..8a1b24d29
--- /dev/null
+++ b/src/fmt/test/fuzzing/chrono-timepoint.cc
@@ -0,0 +1,32 @@
+// 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;
+}