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