FuzzerDefs.h revision 336817
1133936Sobrien//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===// 279968Sobrien// 379968Sobrien// The LLVM Compiler Infrastructure 4133936Sobrien// 579968Sobrien// This file is distributed under the University of Illinois Open Source 679968Sobrien// License. See LICENSE.TXT for details. 779968Sobrien// 879968Sobrien//===----------------------------------------------------------------------===// 979968Sobrien// Basic definitions. 1079968Sobrien//===----------------------------------------------------------------------===// 1179968Sobrien 1279968Sobrien#ifndef LLVM_FUZZER_DEFS_H 1379968Sobrien#define LLVM_FUZZER_DEFS_H 1479968Sobrien 1579968Sobrien#include <cassert> 1679968Sobrien#include <cstddef> 1779968Sobrien#include <cstdint> 1879968Sobrien#include <cstring> 1979968Sobrien#include <string> 2079968Sobrien#include <vector> 2179968Sobrien#include <set> 2279968Sobrien#include <memory> 2379968Sobrien 2479968Sobrien// Platform detection. 2579968Sobrien#ifdef __linux__ 2679968Sobrien#define LIBFUZZER_APPLE 0 2779968Sobrien#define LIBFUZZER_FUCHSIA 0 2879968Sobrien#define LIBFUZZER_LINUX 1 2979968Sobrien#define LIBFUZZER_NETBSD 0 3079968Sobrien#define LIBFUZZER_FREEBSD 0 3179968Sobrien#define LIBFUZZER_OPENBSD 0 3279968Sobrien#define LIBFUZZER_WINDOWS 0 3379968Sobrien#elif __APPLE__ 3479968Sobrien#define LIBFUZZER_APPLE 1 3579968Sobrien#define LIBFUZZER_FUCHSIA 0 3679968Sobrien#define LIBFUZZER_LINUX 0 3779968Sobrien#define LIBFUZZER_NETBSD 0 3879968Sobrien#define LIBFUZZER_FREEBSD 0 3979968Sobrien#define LIBFUZZER_OPENBSD 0 4079968Sobrien#define LIBFUZZER_WINDOWS 0 4179968Sobrien#elif __NetBSD__ 4279968Sobrien#define LIBFUZZER_APPLE 0 4379968Sobrien#define LIBFUZZER_FUCHSIA 0 4479968Sobrien#define LIBFUZZER_LINUX 0 4579968Sobrien#define LIBFUZZER_NETBSD 1 4679968Sobrien#define LIBFUZZER_FREEBSD 0 4779968Sobrien#define LIBFUZZER_OPENBSD 0 4879968Sobrien#define LIBFUZZER_WINDOWS 0 4979968Sobrien#elif __FreeBSD__ 5079968Sobrien#define LIBFUZZER_APPLE 0 51133936Sobrien#define LIBFUZZER_FUCHSIA 0 5279968Sobrien#define LIBFUZZER_LINUX 0 5379968Sobrien#define LIBFUZZER_NETBSD 0 5479968Sobrien#define LIBFUZZER_FREEBSD 1 5579968Sobrien#define LIBFUZZER_OPENBSD 0 5679968Sobrien#define LIBFUZZER_WINDOWS 0 5779968Sobrien#elif __OpenBSD__ 5879968Sobrien#define LIBFUZZER_APPLE 0 5979968Sobrien#define LIBFUZZER_FUCHSIA 0 6079968Sobrien#define LIBFUZZER_LINUX 0 6179968Sobrien#define LIBFUZZER_NETBSD 0 6279968Sobrien#define LIBFUZZER_FREEBSD 0 6379968Sobrien#define LIBFUZZER_OPENBSD 1 6479968Sobrien#define LIBFUZZER_WINDOWS 0 6579968Sobrien#elif _WIN32 6679968Sobrien#define LIBFUZZER_APPLE 0 6779968Sobrien#define LIBFUZZER_FUCHSIA 0 6879968Sobrien#define LIBFUZZER_LINUX 0 6979968Sobrien#define LIBFUZZER_NETBSD 0 7079968Sobrien#define LIBFUZZER_FREEBSD 0 7179968Sobrien#define LIBFUZZER_OPENBSD 0 7279968Sobrien#define LIBFUZZER_WINDOWS 1 7379968Sobrien#elif __Fuchsia__ 7479968Sobrien#define LIBFUZZER_APPLE 0 7579968Sobrien#define LIBFUZZER_FUCHSIA 1 7679968Sobrien#define LIBFUZZER_LINUX 0 7779968Sobrien#define LIBFUZZER_NETBSD 0 7879968Sobrien#define LIBFUZZER_FREEBSD 0 7979968Sobrien#define LIBFUZZER_OPENBSD 0 8079968Sobrien#define LIBFUZZER_WINDOWS 0 8179968Sobrien#else 8279968Sobrien#error "Support for your platform has not been implemented" 8379968Sobrien#endif 8479968Sobrien 8579968Sobrien#ifndef __has_attribute 8679968Sobrien# define __has_attribute(x) 0 8779968Sobrien#endif 8879968Sobrien 8979968Sobrien#define LIBFUZZER_POSIX \ 9079968Sobrien (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 9179968Sobrien LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD) 9279968Sobrien 9379968Sobrien#ifdef __x86_64 9479968Sobrien# if __has_attribute(target) 9579968Sobrien# define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 9679968Sobrien# else 9779968Sobrien# define ATTRIBUTE_TARGET_POPCNT 98108746Sobrien# endif 99108746Sobrien#else 100133936Sobrien# define ATTRIBUTE_TARGET_POPCNT 101108746Sobrien#endif 102108746Sobrien 103108746Sobrien 104108746Sobrien#ifdef __clang__ // avoid gcc warning. 105108746Sobrien# if __has_attribute(no_sanitize) 106108746Sobrien# define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 107108746Sobrien# else 108108746Sobrien# define ATTRIBUTE_NO_SANITIZE_MEMORY 109108746Sobrien# endif 110108746Sobrien# define ALWAYS_INLINE __attribute__((always_inline)) 111108746Sobrien#else 112108746Sobrien# define ATTRIBUTE_NO_SANITIZE_MEMORY 113108746Sobrien# define ALWAYS_INLINE 114108746Sobrien#endif // __clang__ 115108746Sobrien 116108746Sobrien#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 117108746Sobrien 118108746Sobrien#if defined(__has_feature) 119108746Sobrien# if __has_feature(address_sanitizer) 120108746Sobrien# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 12179968Sobrien# elif __has_feature(memory_sanitizer) 12279968Sobrien# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 12392282Sobrien# else 12492282Sobrien# define ATTRIBUTE_NO_SANITIZE_ALL 12592282Sobrien# endif 12692282Sobrien#else 12792282Sobrien# define ATTRIBUTE_NO_SANITIZE_ALL 12879968Sobrien#endif 12979968Sobrien 13079968Sobrien#if LIBFUZZER_WINDOWS 13179968Sobrien#define ATTRIBUTE_INTERFACE __declspec(dllexport) 13279968Sobrien#else 13392282Sobrien#define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 13479968Sobrien#endif 13579968Sobrien 13679968Sobriennamespace fuzzer { 13779968Sobrien 13879968Sobrientemplate <class T> T Min(T a, T b) { return a < b ? a : b; } 13979968Sobrientemplate <class T> T Max(T a, T b) { return a > b ? a : b; } 14079968Sobrien 14179968Sobrienclass Random; 14279968Sobrienclass Dictionary; 14379968Sobrienclass DictionaryEntry; 14479968Sobrienclass MutationDispatcher; 14579968Sobrienstruct FuzzingOptions; 14679968Sobrienclass InputCorpus; 14779968Sobrienstruct InputInfo; 14879968Sobrienstruct ExternalFunctions; 14979968Sobrien 15079968Sobrien// Global interface to functions that may or may not be available. 15179968Sobrienextern ExternalFunctions *EF; 15279968Sobrien 15379968Sobrien// We are using a custom allocator to give a different symbol name to STL 15479968Sobrien// containers in order to avoid ODR violations. 15579968Sobrientemplate<typename T> 15679968Sobrien class fuzzer_allocator: public std::allocator<T> { 15779968Sobrien public: 15879968Sobrien fuzzer_allocator() = default; 15979968Sobrien 16079968Sobrien template<class U> 16179968Sobrien fuzzer_allocator(const fuzzer_allocator<U>&) {} 16279968Sobrien 16379968Sobrien template<class Other> 16479968Sobrien struct rebind { typedef fuzzer_allocator<Other> other; }; 16579968Sobrien }; 16679968Sobrien 16779968Sobrientemplate<typename T> 16879968Sobrienusing Vector = std::vector<T, fuzzer_allocator<T>>; 169110242Sobrien 170110242Sobrientemplate<typename T> 17179968Sobrienusing Set = std::set<T, std::less<T>, fuzzer_allocator<T>>; 17279968Sobrien 17379968Sobrientypedef Vector<uint8_t> Unit; 17479968Sobrientypedef Vector<Unit> UnitVector; 17579968Sobrientypedef int (*UserCallback)(const uint8_t *Data, size_t Size); 17679968Sobrien 17779968Sobrienint FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 17879968Sobrien 17979968Sobrieninline uint8_t Bswap(uint8_t x) { return x; } 18079968Sobrieninline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); } 181110242Sobrieninline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); } 182110242Sobrieninline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); } 183110242Sobrien 18479968Sobrienuint8_t *ExtraCountersBegin(); 18579968Sobrienuint8_t *ExtraCountersEnd(); 18679968Sobrienvoid ClearExtraCounters(); 18779968Sobrien 18879968Sobrienextern bool RunningUserCallback; 18979968Sobrien 19079968Sobrien} // namespace fuzzer 19179968Sobrien 19279968Sobrien#endif // LLVM_FUZZER_DEFS_H 19379968Sobrien