Mercurial > minori
comparison dep/fmt/test/fuzzing/chrono-duration.cc @ 343:1faa72660932
*: transfer back to cmake from autotools
autotools just made lots of things more complicated than
they should have and many things broke (i.e. translations)
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Thu, 20 Jun 2024 05:56:06 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
342:adb79bdde329 | 343:1faa72660932 |
---|---|
1 // Copyright (c) 2019, Paul Dreik | |
2 // For the license information refer to format.h. | |
3 | |
4 #include <fmt/chrono.h> | |
5 | |
6 #include <cstdint> | |
7 | |
8 #include "fuzzer-common.h" | |
9 | |
10 template <typename Period, typename Rep> | |
11 void invoke_inner(fmt::string_view format_str, Rep rep) { | |
12 auto value = std::chrono::duration<Rep, Period>(rep); | |
13 try { | |
14 #if FMT_FUZZ_FORMAT_TO_STRING | |
15 std::string message = fmt::format(format_str, value); | |
16 #else | |
17 auto buf = fmt::memory_buffer(); | |
18 fmt::format_to(std::back_inserter(buf), format_str, value); | |
19 #endif | |
20 } catch (std::exception&) { | |
21 } | |
22 } | |
23 | |
24 // Rep is a duration's representation type. | |
25 template <typename Rep> | |
26 void invoke_outer(const uint8_t* data, size_t size, int period) { | |
27 // Always use a fixed location of the data. | |
28 static_assert(sizeof(Rep) <= fixed_size, "fixed size is too small"); | |
29 if (size <= fixed_size + 1) return; | |
30 | |
31 const Rep rep = assign_from_buf<Rep>(data); | |
32 data += fixed_size; | |
33 size -= fixed_size; | |
34 | |
35 // data is already allocated separately in libFuzzer so reading past the end | |
36 // will most likely be detected anyway. | |
37 const auto format_str = fmt::string_view(as_chars(data), size); | |
38 | |
39 // yocto, zepto, zetta and yotta are not handled. | |
40 switch (period) { | |
41 case 1: | |
42 invoke_inner<std::atto>(format_str, rep); | |
43 break; | |
44 case 2: | |
45 invoke_inner<std::femto>(format_str, rep); | |
46 break; | |
47 case 3: | |
48 invoke_inner<std::pico>(format_str, rep); | |
49 break; | |
50 case 4: | |
51 invoke_inner<std::nano>(format_str, rep); | |
52 break; | |
53 case 5: | |
54 invoke_inner<std::micro>(format_str, rep); | |
55 break; | |
56 case 6: | |
57 invoke_inner<std::milli>(format_str, rep); | |
58 break; | |
59 case 7: | |
60 invoke_inner<std::centi>(format_str, rep); | |
61 break; | |
62 case 8: | |
63 invoke_inner<std::deci>(format_str, rep); | |
64 break; | |
65 case 9: | |
66 invoke_inner<std::deca>(format_str, rep); | |
67 break; | |
68 case 10: | |
69 invoke_inner<std::kilo>(format_str, rep); | |
70 break; | |
71 case 11: | |
72 invoke_inner<std::mega>(format_str, rep); | |
73 break; | |
74 case 12: | |
75 invoke_inner<std::giga>(format_str, rep); | |
76 break; | |
77 case 13: | |
78 invoke_inner<std::tera>(format_str, rep); | |
79 break; | |
80 case 14: | |
81 invoke_inner<std::peta>(format_str, rep); | |
82 break; | |
83 case 15: | |
84 invoke_inner<std::exa>(format_str, rep); | |
85 break; | |
86 } | |
87 } | |
88 | |
89 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
90 if (size <= 4) return 0; | |
91 | |
92 const auto representation = data[0]; | |
93 const auto period = data[1]; | |
94 data += 2; | |
95 size -= 2; | |
96 | |
97 switch (representation) { | |
98 case 1: | |
99 invoke_outer<char>(data, size, period); | |
100 break; | |
101 case 2: | |
102 invoke_outer<signed char>(data, size, period); | |
103 break; | |
104 case 3: | |
105 invoke_outer<unsigned char>(data, size, period); | |
106 break; | |
107 case 4: | |
108 invoke_outer<short>(data, size, period); | |
109 break; | |
110 case 5: | |
111 invoke_outer<unsigned short>(data, size, period); | |
112 break; | |
113 case 6: | |
114 invoke_outer<int>(data, size, period); | |
115 break; | |
116 case 7: | |
117 invoke_outer<unsigned int>(data, size, period); | |
118 break; | |
119 case 8: | |
120 invoke_outer<long>(data, size, period); | |
121 break; | |
122 case 9: | |
123 invoke_outer<unsigned long>(data, size, period); | |
124 break; | |
125 case 10: | |
126 invoke_outer<float>(data, size, period); | |
127 break; | |
128 case 11: | |
129 invoke_outer<double>(data, size, period); | |
130 break; | |
131 case 12: | |
132 invoke_outer<long double>(data, size, period); | |
133 break; | |
134 } | |
135 return 0; | |
136 } |