fuzz.h raw
1 // Copyright (c) 2009-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #ifndef BITCOIN_TEST_FUZZ_FUZZ_H
6 #define BITCOIN_TEST_FUZZ_FUZZ_H
7
8 #include <cstdint>
9 #include <functional>
10 #include <span>
11 #include <string_view>
12
13 /**
14 * Can be used to limit a theoretically unbounded loop. This caps the runtime
15 * to avoid timeouts or OOMs.
16 *
17 * This can be used in combination with a check in the condition to confirm
18 * whether the fuzz engine provided "good" data. If the fuzz input contains
19 * invalid data, the loop aborts early. This will teach the fuzz engine to look
20 * for useful data and avoids bloating the fuzz input folder with useless data.
21 */
22 #define LIMITED_WHILE(condition, limit) \
23 for (unsigned _count{limit}; (condition) && _count; --_count)
24
25 using FuzzBufferType = std::span<const uint8_t>;
26
27 using TypeTestOneInput = std::function<void(FuzzBufferType)>;
28 struct FuzzTargetOptions {
29 std::function<void()> init{[] {}};
30 bool hidden{false};
31 };
32
33 void FuzzFrameworkRegisterTarget(std::string_view name, TypeTestOneInput target, FuzzTargetOptions opts);
34
35 #define FUZZ_TARGET(...) DETAIL_FUZZ(__VA_ARGS__)
36
37 #define DETAIL_FUZZ(name, ...) \
38 void name##_fuzz_target(FuzzBufferType); \
39 struct name##_Before_Main { \
40 name##_Before_Main() \
41 { \
42 FuzzFrameworkRegisterTarget(#name, name##_fuzz_target, {__VA_ARGS__}); \
43 } \
44 } const static g_##name##_before_main; \
45 void name##_fuzz_target(FuzzBufferType buffer)
46
47 #endif // BITCOIN_TEST_FUZZ_FUZZ_H
48