Mercurial > minori
comparison dep/fmt/test/fuzzing/two-args.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/format.h> | |
5 | |
6 #include <cstdint> | |
7 #include <exception> | |
8 #include <string> | |
9 | |
10 #include "fuzzer-common.h" | |
11 | |
12 template <typename Item1, typename Item2> | |
13 void invoke_fmt(const uint8_t* data, size_t size) { | |
14 static_assert(sizeof(Item1) <= fixed_size, "size1 exceeded"); | |
15 static_assert(sizeof(Item2) <= fixed_size, "size2 exceeded"); | |
16 if (size <= fixed_size + fixed_size) return; | |
17 | |
18 const Item1 item1 = assign_from_buf<Item1>(data); | |
19 data += fixed_size; | |
20 size -= fixed_size; | |
21 | |
22 const Item2 item2 = assign_from_buf<Item2>(data); | |
23 data += fixed_size; | |
24 size -= fixed_size; | |
25 | |
26 auto format_str = fmt::string_view(as_chars(data), size); | |
27 #if FMT_FUZZ_FORMAT_TO_STRING | |
28 std::string message = fmt::format(format_str, item1, item2); | |
29 #else | |
30 auto buf = fmt::memory_buffer(); | |
31 fmt::format_to(std::back_inserter(buf), format_str, item1, item2); | |
32 #endif | |
33 } | |
34 | |
35 // For dynamic dispatching to an explicit instantiation. | |
36 template <typename Callback> void invoke(int index, Callback callback) { | |
37 switch (index) { | |
38 case 0: | |
39 callback(bool()); | |
40 break; | |
41 case 1: | |
42 callback(char()); | |
43 break; | |
44 case 2: | |
45 using sc = signed char; | |
46 callback(sc()); | |
47 break; | |
48 case 3: | |
49 using uc = unsigned char; | |
50 callback(uc()); | |
51 break; | |
52 case 4: | |
53 callback(short()); | |
54 break; | |
55 case 5: | |
56 using us = unsigned short; | |
57 callback(us()); | |
58 break; | |
59 case 6: | |
60 callback(int()); | |
61 break; | |
62 case 7: | |
63 callback(unsigned()); | |
64 break; | |
65 case 8: | |
66 callback(long()); | |
67 break; | |
68 case 9: | |
69 using ul = unsigned long; | |
70 callback(ul()); | |
71 break; | |
72 case 10: | |
73 callback(float()); | |
74 break; | |
75 case 11: | |
76 callback(double()); | |
77 break; | |
78 case 12: | |
79 using LD = long double; | |
80 callback(LD()); | |
81 break; | |
82 case 13: | |
83 using ptr = void*; | |
84 callback(ptr()); | |
85 break; | |
86 } | |
87 } | |
88 | |
89 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
90 if (size <= 3) return 0; | |
91 | |
92 // Switch types depending on the first byte of the input. | |
93 const auto type1 = data[0] & 0x0F; | |
94 const auto type2 = (data[0] & 0xF0) >> 4; | |
95 data++; | |
96 size--; | |
97 try { | |
98 invoke(type1, [=](auto param1) { | |
99 invoke(type2, [=](auto param2) { | |
100 invoke_fmt<decltype(param1), decltype(param2)>(data, size); | |
101 }); | |
102 }); | |
103 } catch (std::exception&) { | |
104 } | |
105 return 0; | |
106 } |