FuzzerDefs.h revision 355940
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 157namespace fuzzer { 158 159template <class T> T Min(T a, T b) { return a < b ? a : b; } 160template <class T> T Max(T a, T b) { return a > b ? a : b; } 161 162class Random; 163class Dictionary; 164class DictionaryEntry; 165class MutationDispatcher; 166struct FuzzingOptions; 167class InputCorpus; 168struct InputInfo; 169struct ExternalFunctions; 170 171// Global interface to functions that may or may not be available. 172extern 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. 176template<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 188template<typename T> 189using Vector = std::vector<T, fuzzer_allocator<T>>; 190 191template<typename T> 192using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>; 193 194typedef Vector<uint8_t> Unit; 195typedef Vector<Unit> UnitVector; 196typedef int (*UserCallback)(const uint8_t *Data, size_t Size); 197 198int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 199 200uint8_t *ExtraCountersBegin(); 201uint8_t *ExtraCountersEnd(); 202void ClearExtraCounters(); 203 204extern bool RunningUserCallback; 205 206} // namespace fuzzer 207 208#endif // LLVM_FUZZER_DEFS_H 209