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 } |
