]>
git.proxmox.com Git - ceph.git/blob - ceph/src/fmt/test/fuzzing/one-arg.cc
1 // Copyright (c) 2019, Paul Dreik
2 // For the license information refer to format.h.
6 #include <fmt/chrono.h>
8 #include "fuzzer-common.h"
10 template <typename T
, typename Repr
>
11 const T
* from_repr(const Repr
& r
) { return &r
; }
14 const std::tm
* from_repr
<std::tm
>(const std::time_t& t
) {
15 return std::localtime(&t
);
18 template <typename T
, typename Repr
= T
>
19 void invoke_fmt(const uint8_t* data
, size_t size
) {
20 static_assert(sizeof(Repr
) <= fixed_size
, "Nfixed is too small");
21 if (size
<= fixed_size
) return;
22 auto repr
= assign_from_buf
<Repr
>(data
);
23 const T
* value
= from_repr
<T
>(repr
);
27 data_to_string
format_str(data
, size
);
29 #if FMT_FUZZ_FORMAT_TO_STRING
30 std::string message
= fmt::format(format_str
.get(), *value
);
32 fmt::memory_buffer message
;
33 fmt::format_to(message
, format_str
.get(), *value
);
35 } catch (std::exception
&) {
39 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data
, size_t size
) {
40 if (size
<= 3) return 0;
42 const auto first
= data
[0];
48 invoke_fmt
<bool>(data
, size
);
51 invoke_fmt
<char>(data
, size
);
54 invoke_fmt
<unsigned char>(data
, size
);
57 invoke_fmt
<signed char>(data
, size
);
60 invoke_fmt
<short>(data
, size
);
63 invoke_fmt
<unsigned short>(data
, size
);
66 invoke_fmt
<int>(data
, size
);
69 invoke_fmt
<unsigned int>(data
, size
);
72 invoke_fmt
<long>(data
, size
);
75 invoke_fmt
<unsigned long>(data
, size
);
78 invoke_fmt
<float>(data
, size
);
81 invoke_fmt
<double>(data
, size
);
84 invoke_fmt
<long double>(data
, size
);
87 invoke_fmt
<std::tm
, std::time_t>(data
, size
);