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