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 22 // Platform detection. 23 #ifdef __linux__ 24 #define LIBFUZZER_APPLE 0 25 #define LIBFUZZER_LINUX 1 26 #define LIBFUZZER_WINDOWS 0 27 #elif __APPLE__ 28 #define LIBFUZZER_APPLE 1 29 #define LIBFUZZER_LINUX 0 30 #define LIBFUZZER_WINDOWS 0 31 #elif _WIN32 32 #define LIBFUZZER_APPLE 0 33 #define LIBFUZZER_LINUX 0 34 #define LIBFUZZER_WINDOWS 1 35 #else 36 #error "Support for your platform has not been implemented" 37 #endif 38 39 #ifndef __has_attribute 40 # define __has_attribute(x) 0 41 #endif 42 43 #define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX 44 45 #ifdef __x86_64 46 # if __has_attribute(target) 47 # define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 48 # else 49 # define ATTRIBUTE_TARGET_POPCNT 50 # endif 51 #else 52 # define ATTRIBUTE_TARGET_POPCNT 53 #endif 54 55 56 #ifdef __clang__ // avoid gcc warning. 57 # if __has_attribute(no_sanitize) 58 # define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 59 # else 60 # define ATTRIBUTE_NO_SANITIZE_MEMORY 61 # endif 62 # define ALWAYS_INLINE __attribute__((always_inline)) 63 #else 64 # define ATTRIBUTE_NO_SANITIZE_MEMORY 65 # define ALWAYS_INLINE 66 #endif // __clang__ 67 68 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 69 70 #if defined(__has_feature) 71 # if __has_feature(address_sanitizer) 72 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 73 # elif __has_feature(memory_sanitizer) 74 # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 75 # else 76 # define ATTRIBUTE_NO_SANITIZE_ALL 77 # endif 78 #else 79 # define ATTRIBUTE_NO_SANITIZE_ALL 80 #endif 81 82 #if LIBFUZZER_WINDOWS 83 #define ATTRIBUTE_INTERFACE __declspec(dllexport) 84 #else 85 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 86 #endif 87 88 namespace fuzzer { 89 90 template <class T> T Min(T a, T b) { return a < b ? a : b; } 91 template <class T> T Max(T a, T b) { return a > b ? a : b; } 92 93 class Random; 94 class Dictionary; 95 class DictionaryEntry; 96 class MutationDispatcher; 97 struct FuzzingOptions; 98 class InputCorpus; 99 struct InputInfo; 100 struct ExternalFunctions; 101 102 // Global interface to functions that may or may not be available. 103 extern ExternalFunctions *EF; 104 105 typedef std::vector<uint8_t> Unit; 106 typedef std::vector<Unit> UnitVector; 107 typedef int (*UserCallback)(const uint8_t *Data, size_t Size); 108 109 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 110 111 struct ScopedDoingMyOwnMemOrStr { 112 ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; } 113 ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; } 114 static int DoingMyOwnMemOrStr; 115 }; 116 117 inline uint8_t Bswap(uint8_t x) { return x; } 118 inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); } 119 inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); } 120 inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); } 121 122 uint8_t *ExtraCountersBegin(); 123 uint8_t *ExtraCountersEnd(); 124 void ClearExtraCounters(); 125 126 } // namespace fuzzer 127 128 #endif // LLVM_FUZZER_DEFS_H 129