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 
     22 // Platform detection.
     23 #ifdef __linux__
     24 #define LIBFUZZER_APPLE 0
     25 #define LIBFUZZER_LINUX 1
     26 #define LIBFUZZER_WINDOWS 0
     27 #elif __APPLE__
     28 #define LIBFUZZER_APPLE 1
     29 #define LIBFUZZER_LINUX 0
     30 #define LIBFUZZER_WINDOWS 0
     31 #elif _WIN32
     32 #define LIBFUZZER_APPLE 0
     33 #define LIBFUZZER_LINUX 0
     34 #define LIBFUZZER_WINDOWS 1
     35 #else
     36 #error "Support for your platform has not been implemented"
     37 #endif
     38 
     39 #define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX
     40 
     41 #ifdef __x86_64
     42 #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
     43 #else
     44 #define ATTRIBUTE_TARGET_POPCNT
     45 #endif
     46 
     47 
     48 #ifdef __clang__  // avoid gcc warning.
     49 #  define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
     50 #  define ALWAYS_INLINE __attribute__((always_inline))
     51 #else
     52 #  define ATTRIBUTE_NO_SANITIZE_MEMORY
     53 #  define ALWAYS_INLINE
     54 #endif // __clang__
     55 
     56 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
     57 
     58 #if defined(__has_feature)
     59 #  if __has_feature(address_sanitizer)
     60 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
     61 #  elif __has_feature(memory_sanitizer)
     62 #    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
     63 #  else
     64 #    define ATTRIBUTE_NO_SANITIZE_ALL
     65 #  endif
     66 #else
     67 #  define ATTRIBUTE_NO_SANITIZE_ALL
     68 #endif
     69 
     70 #if LIBFUZZER_WINDOWS
     71 #define ATTRIBUTE_INTERFACE __declspec(dllexport)
     72 #else
     73 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
     74 #endif
     75 
     76 namespace fuzzer {
     77 
     78 template <class T> T Min(T a, T b) { return a < b ? a : b; }
     79 template <class T> T Max(T a, T b) { return a > b ? a : b; }
     80 
     81 class Random;
     82 class Dictionary;
     83 class DictionaryEntry;
     84 class MutationDispatcher;
     85 struct FuzzingOptions;
     86 class InputCorpus;
     87 struct InputInfo;
     88 struct ExternalFunctions;
     89 
     90 // Global interface to functions that may or may not be available.
     91 extern ExternalFunctions *EF;
     92 
     93 typedef std::vector<uint8_t> Unit;
     94 typedef std::vector<Unit> UnitVector;
     95 typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
     96 
     97 int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
     98 
     99 struct ScopedDoingMyOwnMemOrStr {
    100   ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
    101   ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
    102   static int DoingMyOwnMemOrStr;
    103 };
    104 
    105 inline uint8_t  Bswap(uint8_t x)  { return x; }
    106 inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
    107 inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
    108 inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
    109 
    110 uint8_t *ExtraCountersBegin();
    111 uint8_t *ExtraCountersEnd();
    112 void ClearExtraCounters();
    113 
    114 }  // namespace fuzzer
    115 
    116 #endif  // LLVM_FUZZER_DEFS_H
    117