1 //===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_FUZZER_DEFS_H
13 #define LLVM_FUZZER_DEFS_H
24 // Platform detection.
26 #define LIBFUZZER_APPLE 0
27 #define LIBFUZZER_FUCHSIA 0
28 #define LIBFUZZER_LINUX 1
29 #define LIBFUZZER_NETBSD 0
30 #define LIBFUZZER_FREEBSD 0
31 #define LIBFUZZER_OPENBSD 0
32 #define LIBFUZZER_WINDOWS 0
34 #define LIBFUZZER_APPLE 1
35 #define LIBFUZZER_FUCHSIA 0
36 #define LIBFUZZER_LINUX 0
37 #define LIBFUZZER_NETBSD 0
38 #define LIBFUZZER_FREEBSD 0
39 #define LIBFUZZER_OPENBSD 0
40 #define LIBFUZZER_WINDOWS 0
42 #define LIBFUZZER_APPLE 0
43 #define LIBFUZZER_FUCHSIA 0
44 #define LIBFUZZER_LINUX 0
45 #define LIBFUZZER_NETBSD 1
46 #define LIBFUZZER_FREEBSD 0
47 #define LIBFUZZER_OPENBSD 0
48 #define LIBFUZZER_WINDOWS 0
50 #define LIBFUZZER_APPLE 0
51 #define LIBFUZZER_FUCHSIA 0
52 #define LIBFUZZER_LINUX 0
53 #define LIBFUZZER_NETBSD 0
54 #define LIBFUZZER_FREEBSD 1
55 #define LIBFUZZER_OPENBSD 0
56 #define LIBFUZZER_WINDOWS 0
58 #define LIBFUZZER_APPLE 0
59 #define LIBFUZZER_FUCHSIA 0
60 #define LIBFUZZER_LINUX 0
61 #define LIBFUZZER_NETBSD 0
62 #define LIBFUZZER_FREEBSD 0
63 #define LIBFUZZER_OPENBSD 1
64 #define LIBFUZZER_WINDOWS 0
66 #define LIBFUZZER_APPLE 0
67 #define LIBFUZZER_FUCHSIA 0
68 #define LIBFUZZER_LINUX 0
69 #define LIBFUZZER_NETBSD 0
70 #define LIBFUZZER_FREEBSD 0
71 #define LIBFUZZER_OPENBSD 0
72 #define LIBFUZZER_WINDOWS 1
74 #define LIBFUZZER_APPLE 0
75 #define LIBFUZZER_FUCHSIA 1
76 #define LIBFUZZER_LINUX 0
77 #define LIBFUZZER_NETBSD 0
78 #define LIBFUZZER_FREEBSD 0
79 #define LIBFUZZER_OPENBSD 0
80 #define LIBFUZZER_WINDOWS 0
82 #error "Support for your platform has not been implemented"
85 #ifndef __has_attribute
86 # define __has_attribute(x) 0
89 #define LIBFUZZER_POSIX \
90 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \
91 LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
94 # if __has_attribute(target)
95 # define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
97 # define ATTRIBUTE_TARGET_POPCNT
100 # define ATTRIBUTE_TARGET_POPCNT
104 #ifdef __clang__ // avoid gcc warning.
105 # if __has_attribute(no_sanitize)
106 # define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
108 # define ATTRIBUTE_NO_SANITIZE_MEMORY
110 # define ALWAYS_INLINE __attribute__((always_inline))
112 # define ATTRIBUTE_NO_SANITIZE_MEMORY
113 # define ALWAYS_INLINE
116 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
118 #if defined(__has_feature)
119 # if __has_feature(address_sanitizer)
120 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
121 # elif __has_feature(memory_sanitizer)
122 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
124 # define ATTRIBUTE_NO_SANITIZE_ALL
127 # define ATTRIBUTE_NO_SANITIZE_ALL
130 #if LIBFUZZER_WINDOWS
131 #define ATTRIBUTE_INTERFACE __declspec(dllexport)
133 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
138 template <class T> T Min(T a, T b) { return a < b ? a : b; }
139 template <class T> T Max(T a, T b) { return a > b ? a : b; }
143 class DictionaryEntry;
144 class MutationDispatcher;
145 struct FuzzingOptions;
148 struct ExternalFunctions;
150 // Global interface to functions that may or may not be available.
151 extern ExternalFunctions *EF;
153 // We are using a custom allocator to give a different symbol name to STL
154 // containers in order to avoid ODR violations.
156 class fuzzer_allocator: public std::allocator<T> {
158 fuzzer_allocator() = default;
161 fuzzer_allocator(const fuzzer_allocator<U>&) {}
163 template<class Other>
164 struct rebind { typedef fuzzer_allocator<Other> other; };
168 using Vector = std::vector<T, fuzzer_allocator<T>>;
171 using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
173 typedef Vector<uint8_t> Unit;
174 typedef Vector<Unit> UnitVector;
175 typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
177 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
179 inline uint8_t Bswap(uint8_t x) { return x; }
180 inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
181 inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
182 inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
184 uint8_t *ExtraCountersBegin();
185 uint8_t *ExtraCountersEnd();
186 void ClearExtraCounters();
188 extern bool RunningUserCallback;
190 } // namespace fuzzer
192 #endif // LLVM_FUZZER_DEFS_H