1 1.1 kamil //===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // Basic definitions. 10 1.1 kamil //===----------------------------------------------------------------------===// 11 1.1 kamil 12 1.1 kamil #ifndef LLVM_FUZZER_DEFS_H 13 1.1 kamil #define LLVM_FUZZER_DEFS_H 14 1.1 kamil 15 1.1 kamil #include <cassert> 16 1.1 kamil #include <cstddef> 17 1.1 kamil #include <cstdint> 18 1.1 kamil #include <cstring> 19 1.1 kamil #include <string> 20 1.1 kamil #include <vector> 21 1.1 kamil #include <set> 22 1.1 kamil #include <memory> 23 1.1 kamil 24 1.1 kamil // Platform detection. 25 1.1 kamil #ifdef __linux__ 26 1.1 kamil #define LIBFUZZER_APPLE 0 27 1.1 kamil #define LIBFUZZER_FUCHSIA 0 28 1.1 kamil #define LIBFUZZER_LINUX 1 29 1.1 kamil #define LIBFUZZER_NETBSD 0 30 1.1 kamil #define LIBFUZZER_FREEBSD 0 31 1.1 kamil #define LIBFUZZER_OPENBSD 0 32 1.1 kamil #define LIBFUZZER_WINDOWS 0 33 1.1 kamil #elif __APPLE__ 34 1.1 kamil #define LIBFUZZER_APPLE 1 35 1.1 kamil #define LIBFUZZER_FUCHSIA 0 36 1.1 kamil #define LIBFUZZER_LINUX 0 37 1.1 kamil #define LIBFUZZER_NETBSD 0 38 1.1 kamil #define LIBFUZZER_FREEBSD 0 39 1.1 kamil #define LIBFUZZER_OPENBSD 0 40 1.1 kamil #define LIBFUZZER_WINDOWS 0 41 1.1 kamil #elif __NetBSD__ 42 1.1 kamil #define LIBFUZZER_APPLE 0 43 1.1 kamil #define LIBFUZZER_FUCHSIA 0 44 1.1 kamil #define LIBFUZZER_LINUX 0 45 1.1 kamil #define LIBFUZZER_NETBSD 1 46 1.1 kamil #define LIBFUZZER_FREEBSD 0 47 1.1 kamil #define LIBFUZZER_OPENBSD 0 48 1.1 kamil #define LIBFUZZER_WINDOWS 0 49 1.1 kamil #elif __FreeBSD__ 50 1.1 kamil #define LIBFUZZER_APPLE 0 51 1.1 kamil #define LIBFUZZER_FUCHSIA 0 52 1.1 kamil #define LIBFUZZER_LINUX 0 53 1.1 kamil #define LIBFUZZER_NETBSD 0 54 1.1 kamil #define LIBFUZZER_FREEBSD 1 55 1.1 kamil #define LIBFUZZER_OPENBSD 0 56 1.1 kamil #define LIBFUZZER_WINDOWS 0 57 1.1 kamil #elif __OpenBSD__ 58 1.1 kamil #define LIBFUZZER_APPLE 0 59 1.1 kamil #define LIBFUZZER_FUCHSIA 0 60 1.1 kamil #define LIBFUZZER_LINUX 0 61 1.1 kamil #define LIBFUZZER_NETBSD 0 62 1.1 kamil #define LIBFUZZER_FREEBSD 0 63 1.1 kamil #define LIBFUZZER_OPENBSD 1 64 1.1 kamil #define LIBFUZZER_WINDOWS 0 65 1.1 kamil #elif _WIN32 66 1.1 kamil #define LIBFUZZER_APPLE 0 67 1.1 kamil #define LIBFUZZER_FUCHSIA 0 68 1.1 kamil #define LIBFUZZER_LINUX 0 69 1.1 kamil #define LIBFUZZER_NETBSD 0 70 1.1 kamil #define LIBFUZZER_FREEBSD 0 71 1.1 kamil #define LIBFUZZER_OPENBSD 0 72 1.1 kamil #define LIBFUZZER_WINDOWS 1 73 1.1 kamil #elif __Fuchsia__ 74 1.1 kamil #define LIBFUZZER_APPLE 0 75 1.1 kamil #define LIBFUZZER_FUCHSIA 1 76 1.1 kamil #define LIBFUZZER_LINUX 0 77 1.1 kamil #define LIBFUZZER_NETBSD 0 78 1.1 kamil #define LIBFUZZER_FREEBSD 0 79 1.1 kamil #define LIBFUZZER_OPENBSD 0 80 1.1 kamil #define LIBFUZZER_WINDOWS 0 81 1.1 kamil #else 82 1.1 kamil #error "Support for your platform has not been implemented" 83 1.1 kamil #endif 84 1.1 kamil 85 1.1 kamil #ifndef __has_attribute 86 1.1 kamil # define __has_attribute(x) 0 87 1.1 kamil #endif 88 1.1 kamil 89 1.1 kamil #define LIBFUZZER_POSIX \ 90 1.1 kamil (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 91 1.1 kamil LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD) 92 1.1 kamil 93 1.1 kamil #ifdef __x86_64 94 1.1 kamil # if __has_attribute(target) 95 1.1 kamil # define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 96 1.1 kamil # else 97 1.1 kamil # define ATTRIBUTE_TARGET_POPCNT 98 1.1 kamil # endif 99 1.1 kamil #else 100 1.1 kamil # define ATTRIBUTE_TARGET_POPCNT 101 1.1 kamil #endif 102 1.1 kamil 103 1.1 kamil 104 1.1 kamil #ifdef __clang__ // avoid gcc warning. 105 1.1 kamil # if __has_attribute(no_sanitize) 106 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 107 1.1 kamil # else 108 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_MEMORY 109 1.1 kamil # endif 110 1.1 kamil # define ALWAYS_INLINE __attribute__((always_inline)) 111 1.1 kamil #else 112 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_MEMORY 113 1.1 kamil # define ALWAYS_INLINE 114 1.1 kamil #endif // __clang__ 115 1.1 kamil 116 1.1 kamil #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 117 1.1 kamil 118 1.1 kamil #if defined(__has_feature) 119 1.1 kamil # if __has_feature(address_sanitizer) 120 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 121 1.1 kamil # elif __has_feature(memory_sanitizer) 122 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 123 1.1 kamil # else 124 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_ALL 125 1.1 kamil # endif 126 1.1 kamil #else 127 1.1 kamil # define ATTRIBUTE_NO_SANITIZE_ALL 128 1.1 kamil #endif 129 1.1 kamil 130 1.1 kamil #if LIBFUZZER_WINDOWS 131 1.1 kamil #define ATTRIBUTE_INTERFACE __declspec(dllexport) 132 1.1 kamil // This is used for __sancov_lowest_stack which is needed for 133 1.1 kamil // -fsanitize-coverage=stack-depth. That feature is not yet available on 134 1.1 kamil // Windows, so make the symbol static to avoid linking errors. 135 1.1 kamil #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 136 1.1 kamil __attribute__((tls_model("initial-exec"))) thread_local static 137 1.1 kamil #else 138 1.1 kamil #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 139 1.1 kamil #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 140 1.1 kamil ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 141 1.1 kamil #endif 142 1.1 kamil 143 1.1 kamil namespace fuzzer { 144 1.1 kamil 145 1.1 kamil template <class T> T Min(T a, T b) { return a < b ? a : b; } 146 1.1 kamil template <class T> T Max(T a, T b) { return a > b ? a : b; } 147 1.1 kamil 148 1.1 kamil class Random; 149 1.1 kamil class Dictionary; 150 1.1 kamil class DictionaryEntry; 151 1.1 kamil class MutationDispatcher; 152 1.1 kamil struct FuzzingOptions; 153 1.1 kamil class InputCorpus; 154 1.1 kamil struct InputInfo; 155 1.1 kamil struct ExternalFunctions; 156 1.1 kamil 157 1.1 kamil // Global interface to functions that may or may not be available. 158 1.1 kamil extern ExternalFunctions *EF; 159 1.1 kamil 160 1.1 kamil // We are using a custom allocator to give a different symbol name to STL 161 1.1 kamil // containers in order to avoid ODR violations. 162 1.1 kamil template<typename T> 163 1.1 kamil class fuzzer_allocator: public std::allocator<T> { 164 1.1 kamil public: 165 1.1 kamil fuzzer_allocator() = default; 166 1.1 kamil 167 1.1 kamil template<class U> 168 1.1 kamil fuzzer_allocator(const fuzzer_allocator<U>&) {} 169 1.1 kamil 170 1.1 kamil template<class Other> 171 1.1 kamil struct rebind { typedef fuzzer_allocator<Other> other; }; 172 1.1 kamil }; 173 1.1 kamil 174 1.1 kamil template<typename T> 175 1.1 kamil using Vector = std::vector<T, fuzzer_allocator<T>>; 176 1.1 kamil 177 1.1 kamil template<typename T> 178 1.1 kamil using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>; 179 1.1 kamil 180 1.1 kamil typedef Vector<uint8_t> Unit; 181 1.1 kamil typedef Vector<Unit> UnitVector; 182 1.1 kamil typedef int (*UserCallback)(const uint8_t *Data, size_t Size); 183 1.1 kamil 184 1.1 kamil int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 185 1.1 kamil 186 1.1 kamil inline uint8_t Bswap(uint8_t x) { return x; } 187 1.1 kamil inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); } 188 1.1 kamil inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); } 189 1.1 kamil inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); } 190 1.1 kamil 191 1.1 kamil uint8_t *ExtraCountersBegin(); 192 1.1 kamil uint8_t *ExtraCountersEnd(); 193 1.1 kamil void ClearExtraCounters(); 194 1.1 kamil 195 1.1 kamil extern bool RunningUserCallback; 196 1.1 kamil 197 1.1 kamil } // namespace fuzzer 198 1.1 kamil 199 1.1 kamil #endif // LLVM_FUZZER_DEFS_H 200