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
143namespace fuzzer {
144
145template <class T> T Min(T a, T b) { return a < b ? a : b; }
146template <class T> T Max(T a, T b) { return a > b ? a : b; }
147
148class Random;
149class Dictionary;
150class DictionaryEntry;
151class MutationDispatcher;
152struct FuzzingOptions;
153class InputCorpus;
154struct InputInfo;
155struct ExternalFunctions;
156
157// Global interface to functions that may or may not be available.
158extern 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.
162template<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
174template<typename T>
175using Vector = std::vector<T, fuzzer_allocator<T>>;
176
177template<typename T>
178using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
179
180typedef Vector<uint8_t> Unit;
181typedef Vector<Unit> UnitVector;
182typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
183
184int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
185
186inline uint8_t  Bswap(uint8_t x)  { return x; }
187inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
188inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
189inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
190
191uint8_t *ExtraCountersBegin();
192uint8_t *ExtraCountersEnd();
193void ClearExtraCounters();
194
195extern bool RunningUserCallback;
196
197}  // namespace fuzzer
198
199#endif  // LLVM_FUZZER_DEFS_H
200