| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1 |
// Copyright (c) 2019, Paul Dreik |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2 |
// For the license information refer to format.h. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
3 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
4 |
#ifndef FUZZER_COMMON_H |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
5 |
#define FUZZER_COMMON_H |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
6 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
7 |
#include <fmt/core.h> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
8 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
9 |
#include <cstdint> // std::uint8_t |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
10 |
#include <cstring> // memcpy |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
11 |
#include <vector> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
12 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
13 |
// One can format to either a string, or a buffer. The latter is faster, but |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
14 |
// one may be interested in formatting to a string instead to verify it works |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
15 |
// as intended. To avoid a combinatoric explosion, select this at compile time |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
16 |
// instead of dynamically from the fuzz data. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
17 |
#define FMT_FUZZ_FORMAT_TO_STRING 0 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
18 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
19 |
// If {fmt} is given a buffer that is separately allocated, chances that address |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
20 |
// sanitizer detects out of bound reads is much higher. However, it slows down |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
21 |
// the fuzzing. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
22 |
#define FMT_FUZZ_SEPARATE_ALLOCATION 1 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
23 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
24 |
// The size of the largest possible type in use. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
25 |
// To let the the fuzzer mutation be efficient at cross pollinating between |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
26 |
// different types, use a fixed size format. The same bit pattern, interpreted |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
27 |
// as another type, is likely interesting. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
28 |
constexpr auto fixed_size = 16; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
29 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
30 |
// Casts data to a char pointer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
31 |
template <typename T> inline const char* as_chars(const T* data) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
32 |
return reinterpret_cast<const char*>(data); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
33 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
34 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
35 |
// Casts data to a byte pointer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
36 |
template <typename T> inline const std::uint8_t* as_bytes(const T* data) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
37 |
return reinterpret_cast<const std::uint8_t*>(data); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
38 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
39 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
40 |
// Blits bytes from data to form an (assumed trivially constructible) object |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
41 |
// of type Item. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
42 |
template <class Item> inline Item assign_from_buf(const std::uint8_t* data) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
43 |
auto item = Item(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
44 |
std::memcpy(&item, data, sizeof(Item)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
45 |
return item; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
46 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
47 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
48 |
// Reads a boolean value by looking at the first byte from data. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
49 |
template <> inline bool assign_from_buf<bool>(const std::uint8_t* data) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
50 |
return *data != 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
51 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
52 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
53 |
struct data_to_string { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
54 |
#if FMT_FUZZ_SEPARATE_ALLOCATION |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
55 |
std::vector<char> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
56 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
57 |
data_to_string(const uint8_t* data, size_t size, bool add_terminator = false) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
58 |
: buffer(size + (add_terminator ? 1 : 0)) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
59 |
if (size) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
60 |
std::memcpy(buffer.data(), data, size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
61 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
62 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
63 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
64 |
fmt::string_view get() const { return {buffer.data(), buffer.size()}; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
65 |
#else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
66 |
fmt::string_view sv; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
67 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
68 |
data_to_string(const uint8_t* data, size_t size, bool = false) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
69 |
: str(as_chars(data), size) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
70 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
71 |
fmt::string_view get() const { return sv; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
72 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
73 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
74 |
const char* data() const { return get().data(); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
75 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
76 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
77 |
#endif // FUZZER_COMMON_H |
|
|
1970-01-01 00:00 |
78 |
|