Home | History | Annotate | 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_LINUX 1
     28 #define LIBFUZZER_NETBSD 0
     29 #define LIBFUZZER_WINDOWS 0
     30 #elif __APPLE__
     31 #define LIBFUZZER_APPLE 1
     32 #define LIBFUZZER_LINUX 0
     33 #define LIBFUZZER_NETBSD 0
     34 #define LIBFUZZER_WINDOWS 0
     35 #elif __NetBSD__
     36 #define LIBFUZZER_APPLE 0
     37 #define LIBFUZZER_LINUX 0
     38 #define LIBFUZZER_NETBSD 1
     39 #define LIBFUZZER_WINDOWS 0
     40 #elif _WIN32
     41 #define LIBFUZZER_APPLE 0
     42 #define LIBFUZZER_LINUX 0
     43 #define LIBFUZZER_NETBSD 0
     44 #define LIBFUZZER_WINDOWS 1
     45 #else
     46 #error "Support for your platform has not been implemented"
     47 #endif
     48 
     49 #ifndef __has_attribute
     50 #  define __has_attribute(x) 0
     51 #endif
     52 
     53 #define LIBFUZZER_POSIX (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD)
     54 
     55 #ifdef __x86_64
     56 #  if __has_attribute(target)
     57 #    define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
     58 #  else
     59 #    define ATTRIBUTE_TARGET_POPCNT
     60 #  endif
     61 #else
     62 #  define ATTRIBUTE_TARGET_POPCNT
     63 #endif
     64 
     65 
     66 #ifdef __clang__  // avoid gcc warning.
     67 #  if __has_attribute(no_sanitize)
     68 #    define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
     69 #  else
     70 #    define ATTRIBUTE_NO_SANITIZE_MEMORY
     71 #  endif
     72 #  define ALWAYS_INLINE __attribute__((always_inline))
     73 #else
     74 #  define ATTRIBUTE_NO_SANITIZE_MEMORY
     75 #  define ALWAYS_INLINE
     76 #endif // __clang__
     77 
     78 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
     79 
     80 #if defined(__has_feature)
     81 #  if __has_feature(address_sanitizer)
     82 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
     83 #  elif __has_feature(memory_sanitizer)
     84 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
     85 #  else
     86 #    define ATTRIBUTE_NO_SANITIZE_ALL
     87 #  endif
     88 #else
     89 #  define ATTRIBUTE_NO_SANITIZE_ALL
     90 #endif
     91 
     92 #if LIBFUZZER_WINDOWS
     93 #define ATTRIBUTE_INTERFACE __declspec(dllexport)
     94 #else
     95 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
     96 #endif
     97 
     98 namespace fuzzer {
     99 
    100 template <class T> T Min(T a, T b) { return a < b ? a : b; }
    101 template <class T> T Max(T a, T b) { return a > b ? a : b; }
    102 
    103 class Random;
    104 class Dictionary;
    105 class DictionaryEntry;
    106 class MutationDispatcher;
    107 struct FuzzingOptions;
    108 class InputCorpus;
    109 struct InputInfo;
    110 struct ExternalFunctions;
    111 
    112 // Global interface to functions that may or may not be available.
    113 extern ExternalFunctions *EF;
    114 
    115 // We are using a custom allocator to give a different symbol name to STL
    116 // containers in order to avoid ODR violations.
    117 template<typename T>
    118   class fuzzer_allocator: public std::allocator<T> {
    119     public:
    120       template<class Other>
    121       struct rebind { typedef fuzzer_allocator<Other> other;  };
    122   };
    123 
    124 template<typename T>
    125 using Vector = std::vector<T, fuzzer_allocator<T>>;
    126 
    127 template<typename T>
    128 using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
    129 
    130 typedef Vector<uint8_t> Unit;
    131 typedef Vector<Unit> UnitVector;
    132 typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
    133 
    134 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
    135 
    136 struct ScopedDoingMyOwnMemOrStr {
    137   ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
    138   ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
    139   static int DoingMyOwnMemOrStr;
    140 };
    141 
    142 inline uint8_t  Bswap(uint8_t x)  { return x; }
    143 inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
    144 inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
    145 inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
    146 
    147 uint8_t *ExtraCountersBegin();
    148 uint8_t *ExtraCountersEnd();
    149 void ClearExtraCounters();
    150 
    151 uint64_t *ClangCountersBegin();
    152 uint64_t *ClangCountersEnd();
    153 void ClearClangCounters();
    154 
    155 }  // namespace fuzzer
    156 
    157 #endif  // LLVM_FUZZER_DEFS_H
    158