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