//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Basic definitions. //===----------------------------------------------------------------------===// #ifndef LLVM_FUZZER_DEFS_H #define LLVM_FUZZER_DEFS_H #include #include #include #include #include #include // Platform detection. #ifdef __linux__ #define LIBFUZZER_APPLE 0 #define LIBFUZZER_LINUX 1 #define LIBFUZZER_WINDOWS 0 #elif __APPLE__ #define LIBFUZZER_APPLE 1 #define LIBFUZZER_LINUX 0 #define LIBFUZZER_WINDOWS 0 #elif _WIN32 #define LIBFUZZER_APPLE 0 #define LIBFUZZER_LINUX 0 #define LIBFUZZER_WINDOWS 1 #else #error "Support for your platform has not been implemented" #endif #ifndef __has_attribute # define __has_attribute(x) 0 #endif #define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX #ifdef __x86_64 # if __has_attribute(target) # define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) # else # define ATTRIBUTE_TARGET_POPCNT # endif #else # define ATTRIBUTE_TARGET_POPCNT #endif #ifdef __clang__ // avoid gcc warning. # if __has_attribute(no_sanitize) # define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) # else # define ATTRIBUTE_NO_SANITIZE_MEMORY # endif # define ALWAYS_INLINE __attribute__((always_inline)) #else # define ATTRIBUTE_NO_SANITIZE_MEMORY # define ALWAYS_INLINE #endif // __clang__ #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #if defined(__has_feature) # if __has_feature(address_sanitizer) # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS # elif __has_feature(memory_sanitizer) # define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY # else # define ATTRIBUTE_NO_SANITIZE_ALL # endif #else # define ATTRIBUTE_NO_SANITIZE_ALL #endif #if LIBFUZZER_WINDOWS #define ATTRIBUTE_INTERFACE __declspec(dllexport) #else #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) #endif namespace fuzzer { template T Min(T a, T b) { return a < b ? a : b; } template T Max(T a, T b) { return a > b ? a : b; } class Random; class Dictionary; class DictionaryEntry; class MutationDispatcher; struct FuzzingOptions; class InputCorpus; struct InputInfo; struct ExternalFunctions; // Global interface to functions that may or may not be available. extern ExternalFunctions *EF; typedef std::vector Unit; typedef std::vector UnitVector; typedef int (*UserCallback)(const uint8_t *Data, size_t Size); int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); struct ScopedDoingMyOwnMemOrStr { ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; } ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; } static int DoingMyOwnMemOrStr; }; inline uint8_t Bswap(uint8_t x) { return x; } inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); } inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); } inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); } uint8_t *ExtraCountersBegin(); uint8_t *ExtraCountersEnd(); void ClearExtraCounters(); } // namespace fuzzer #endif // LLVM_FUZZER_DEFS_H