FuzzerDefs.h revision 360784
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 <memory> 19#include <set> 20#include <string> 21#include <vector> 22 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#define LIBFUZZER_EMSCRIPTEN 0 34#elif __APPLE__ 35#define LIBFUZZER_APPLE 1 36#define LIBFUZZER_FUCHSIA 0 37#define LIBFUZZER_LINUX 0 38#define LIBFUZZER_NETBSD 0 39#define LIBFUZZER_FREEBSD 0 40#define LIBFUZZER_OPENBSD 0 41#define LIBFUZZER_WINDOWS 0 42#define LIBFUZZER_EMSCRIPTEN 0 43#elif __NetBSD__ 44#define LIBFUZZER_APPLE 0 45#define LIBFUZZER_FUCHSIA 0 46#define LIBFUZZER_LINUX 0 47#define LIBFUZZER_NETBSD 1 48#define LIBFUZZER_FREEBSD 0 49#define LIBFUZZER_OPENBSD 0 50#define LIBFUZZER_WINDOWS 0 51#define LIBFUZZER_EMSCRIPTEN 0 52#elif __FreeBSD__ 53#define LIBFUZZER_APPLE 0 54#define LIBFUZZER_FUCHSIA 0 55#define LIBFUZZER_LINUX 0 56#define LIBFUZZER_NETBSD 0 57#define LIBFUZZER_FREEBSD 1 58#define LIBFUZZER_OPENBSD 0 59#define LIBFUZZER_WINDOWS 0 60#define LIBFUZZER_EMSCRIPTEN 0 61#elif __OpenBSD__ 62#define LIBFUZZER_APPLE 0 63#define LIBFUZZER_FUCHSIA 0 64#define LIBFUZZER_LINUX 0 65#define LIBFUZZER_NETBSD 0 66#define LIBFUZZER_FREEBSD 0 67#define LIBFUZZER_OPENBSD 1 68#define LIBFUZZER_WINDOWS 0 69#define LIBFUZZER_EMSCRIPTEN 0 70#elif _WIN32 71#define LIBFUZZER_APPLE 0 72#define LIBFUZZER_FUCHSIA 0 73#define LIBFUZZER_LINUX 0 74#define LIBFUZZER_NETBSD 0 75#define LIBFUZZER_FREEBSD 0 76#define LIBFUZZER_OPENBSD 0 77#define LIBFUZZER_WINDOWS 1 78#define LIBFUZZER_EMSCRIPTEN 0 79#elif __Fuchsia__ 80#define LIBFUZZER_APPLE 0 81#define LIBFUZZER_FUCHSIA 1 82#define LIBFUZZER_LINUX 0 83#define LIBFUZZER_NETBSD 0 84#define LIBFUZZER_FREEBSD 0 85#define LIBFUZZER_OPENBSD 0 86#define LIBFUZZER_WINDOWS 0 87#define LIBFUZZER_EMSCRIPTEN 0 88#elif __EMSCRIPTEN__ 89#define LIBFUZZER_APPLE 0 90#define LIBFUZZER_FUCHSIA 0 91#define LIBFUZZER_LINUX 0 92#define LIBFUZZER_NETBSD 0 93#define LIBFUZZER_FREEBSD 0 94#define LIBFUZZER_OPENBSD 0 95#define LIBFUZZER_WINDOWS 0 96#define LIBFUZZER_EMSCRIPTEN 1 97#else 98#error "Support for your platform has not been implemented" 99#endif 100 101#if defined(_MSC_VER) && !defined(__clang__) 102// MSVC compiler is being used. 103#define LIBFUZZER_MSVC 1 104#else 105#define LIBFUZZER_MSVC 0 106#endif 107 108#ifndef __has_attribute 109# define __has_attribute(x) 0 110#endif 111 112#define LIBFUZZER_POSIX \ 113 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 114 LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD || LIBFUZZER_EMSCRIPTEN) 115 116#ifdef __x86_64 117# if __has_attribute(target) 118# define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 119# else 120# define ATTRIBUTE_TARGET_POPCNT 121# endif 122#else 123# define ATTRIBUTE_TARGET_POPCNT 124#endif 125 126 127#ifdef __clang__ // avoid gcc warning. 128# if __has_attribute(no_sanitize) 129# define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 130# else 131# define ATTRIBUTE_NO_SANITIZE_MEMORY 132# endif 133# define ALWAYS_INLINE __attribute__((always_inline)) 134#else 135# define ATTRIBUTE_NO_SANITIZE_MEMORY 136# define ALWAYS_INLINE 137#endif // __clang__ 138 139#if LIBFUZZER_WINDOWS 140#define ATTRIBUTE_NO_SANITIZE_ADDRESS 141#else 142#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 143#endif 144 145#if LIBFUZZER_WINDOWS 146#define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) 147#define ATTRIBUTE_INTERFACE __declspec(dllexport) 148// This is used for __sancov_lowest_stack which is needed for 149// -fsanitize-coverage=stack-depth. That feature is not yet available on 150// Windows, so make the symbol static to avoid linking errors. 151#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static 152#define ATTRIBUTE_NOINLINE __declspec(noinline) 153#else 154#define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) 155#define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 156#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 157 ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 158 159#define ATTRIBUTE_NOINLINE __attribute__((noinline)) 160#endif 161 162#if defined(__has_feature) 163# if __has_feature(address_sanitizer) 164# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 165# elif __has_feature(memory_sanitizer) 166# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 167# else 168# define ATTRIBUTE_NO_SANITIZE_ALL 169# endif 170#else 171# define ATTRIBUTE_NO_SANITIZE_ALL 172#endif 173 174namespace fuzzer { 175 176template <class T> T Min(T a, T b) { return a < b ? a : b; } 177template <class T> T Max(T a, T b) { return a > b ? a : b; } 178 179class Random; 180class Dictionary; 181class DictionaryEntry; 182class MutationDispatcher; 183struct FuzzingOptions; 184class InputCorpus; 185struct InputInfo; 186struct ExternalFunctions; 187 188// Global interface to functions that may or may not be available. 189extern ExternalFunctions *EF; 190 191// We are using a custom allocator to give a different symbol name to STL 192// containers in order to avoid ODR violations. 193template<typename T> 194 class fuzzer_allocator: public std::allocator<T> { 195 public: 196 fuzzer_allocator() = default; 197 198 template<class U> 199 fuzzer_allocator(const fuzzer_allocator<U>&) {} 200 201 template<class Other> 202 struct rebind { typedef fuzzer_allocator<Other> other; }; 203 }; 204 205template<typename T> 206using Vector = std::vector<T, fuzzer_allocator<T>>; 207 208template<typename T> 209using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>; 210 211typedef Vector<uint8_t> Unit; 212typedef Vector<Unit> UnitVector; 213typedef int (*UserCallback)(const uint8_t *Data, size_t Size); 214 215int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 216 217uint8_t *ExtraCountersBegin(); 218uint8_t *ExtraCountersEnd(); 219void ClearExtraCounters(); 220 221extern bool RunningUserCallback; 222 223} // namespace fuzzer 224 225#endif // LLVM_FUZZER_DEFS_H 226