xref: /aosp_15_r20/external/fmtlib/test/fuzzing/chrono-timepoint.cc (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker // Copyright (c) 2021, Paul Dreik
2*5c90c05cSAndroid Build Coastguard Worker // For license information refer to format.h.
3*5c90c05cSAndroid Build Coastguard Worker #include <fmt/chrono.h>
4*5c90c05cSAndroid Build Coastguard Worker 
5*5c90c05cSAndroid Build Coastguard Worker #include "fuzzer-common.h"
6*5c90c05cSAndroid Build Coastguard Worker 
7*5c90c05cSAndroid Build Coastguard Worker /*
8*5c90c05cSAndroid Build Coastguard Worker  * a fuzzer for the chrono timepoints formatters
9*5c90c05cSAndroid Build Coastguard Worker  * C is a clock (std::chrono::system_clock etc)
10*5c90c05cSAndroid Build Coastguard Worker  */
doit(const uint8_t * data,size_t size)11*5c90c05cSAndroid Build Coastguard Worker template <typename C> void doit(const uint8_t* data, size_t size) {
12*5c90c05cSAndroid Build Coastguard Worker   using Rep = typename C::time_point::rep;
13*5c90c05cSAndroid Build Coastguard Worker   constexpr auto N = sizeof(Rep);
14*5c90c05cSAndroid Build Coastguard Worker   if (size < N) return;
15*5c90c05cSAndroid Build Coastguard Worker 
16*5c90c05cSAndroid Build Coastguard Worker   const auto x = assign_from_buf<Rep>(data);
17*5c90c05cSAndroid Build Coastguard Worker   typename C::duration dur{x};
18*5c90c05cSAndroid Build Coastguard Worker   typename C::time_point timepoint{dur};
19*5c90c05cSAndroid Build Coastguard Worker   data += N;
20*5c90c05cSAndroid Build Coastguard Worker   size -= N;
21*5c90c05cSAndroid Build Coastguard Worker   data_to_string format_str(data, size);
22*5c90c05cSAndroid Build Coastguard Worker 
23*5c90c05cSAndroid Build Coastguard Worker   std::string message = fmt::format(format_str.get(), timepoint);
24*5c90c05cSAndroid Build Coastguard Worker }
25*5c90c05cSAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)26*5c90c05cSAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
27*5c90c05cSAndroid Build Coastguard Worker   try {
28*5c90c05cSAndroid Build Coastguard Worker     doit<std::chrono::system_clock>(data, size);
29*5c90c05cSAndroid Build Coastguard Worker   } catch (...) {
30*5c90c05cSAndroid Build Coastguard Worker   }
31*5c90c05cSAndroid Build Coastguard Worker   return 0;
32*5c90c05cSAndroid Build Coastguard Worker }
33