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