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