]>
git.proxmox.com Git - ceph.git/blob - ceph/src/fmt/test/fuzzing/one_arg.cpp
1 // Copyright (c) 2019, Paul Dreik
2 // License: see LICENSE.rst in the fmt root directory
10 #include <fmt/chrono.h>
11 #include "fuzzer_common.h"
13 using fmt_fuzzer::Nfixed
;
15 template <typename Item
>
16 void invoke_fmt(const uint8_t* Data
, size_t Size
) {
17 constexpr auto N
= sizeof(Item
);
18 static_assert(N
<= Nfixed
, "Nfixed is too small");
22 const Item item
= fmt_fuzzer::assignFromBuf
<Item
>(Data
);
26 #if FMT_FUZZ_SEPARATE_ALLOCATION
27 // allocates as tight as possible, making it easier to catch buffer overruns.
28 std::vector
<char> fmtstringbuffer(Size
);
29 std::memcpy(fmtstringbuffer
.data(), Data
, Size
);
30 auto fmtstring
= fmt::string_view(fmtstringbuffer
.data(), Size
);
32 auto fmtstring
= fmt::string_view(fmt_fuzzer::as_chars(Data
), Size
);
35 #if FMT_FUZZ_FORMAT_TO_STRING
36 std::string message
= fmt::format(fmtstring
, item
);
38 fmt::memory_buffer message
;
39 fmt::format_to(message
, fmtstring
, item
);
43 void invoke_fmt_time(const uint8_t* Data
, size_t Size
) {
44 using Item
= std::time_t;
45 constexpr auto N
= sizeof(Item
);
46 static_assert(N
<= Nfixed
, "Nfixed too small");
50 const Item item
= fmt_fuzzer::assignFromBuf
<Item
>(Data
);
53 #if FMT_FUZZ_SEPARATE_ALLOCATION
54 // allocates as tight as possible, making it easier to catch buffer overruns.
55 std::vector
<char> fmtstringbuffer(Size
);
56 std::memcpy(fmtstringbuffer
.data(), Data
, Size
);
57 auto fmtstring
= fmt::string_view(fmtstringbuffer
.data(), Size
);
59 auto fmtstring
= fmt::string_view(fmt_fuzzer::as_chars(Data
), Size
);
61 auto* b
= std::localtime(&item
);
63 #if FMT_FUZZ_FORMAT_TO_STRING
64 std::string message
= fmt::format(fmtstring
, *b
);
66 fmt::memory_buffer message
;
67 fmt::format_to(message
, fmtstring
, *b
);
72 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data
, size_t Size
) {
77 const auto first
= Data
[0];
84 invoke_fmt
<bool>(Data
, Size
);
87 invoke_fmt
<char>(Data
, Size
);
90 invoke_fmt
<unsigned char>(Data
, Size
);
93 invoke_fmt
<signed char>(Data
, Size
);
96 invoke_fmt
<short>(Data
, Size
);
99 invoke_fmt
<unsigned short>(Data
, Size
);
102 invoke_fmt
<int>(Data
, Size
);
105 invoke_fmt
<unsigned int>(Data
, Size
);
108 invoke_fmt
<long>(Data
, Size
);
111 invoke_fmt
<unsigned long>(Data
, Size
);
114 invoke_fmt
<float>(Data
, Size
);
117 invoke_fmt
<double>(Data
, Size
);
120 invoke_fmt
<long double>(Data
, Size
);
123 invoke_fmt_time(Data
, Size
);
128 } catch (std::exception
& /*e*/) {