blob: 5dc2d8e1ac09855b7b47000ca99d8fdb6d3d1a8c [file] [log] [blame]
george.karpenkov29efa6d2017-08-21 23:25:50 +00001//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
2//
chandlerc40284492019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
george.karpenkov29efa6d2017-08-21 23:25:50 +00006//
7//===----------------------------------------------------------------------===//
8// Basic definitions.
9//===----------------------------------------------------------------------===//
10
11#ifndef LLVM_FUZZER_DEFS_H
12#define LLVM_FUZZER_DEFS_H
13
14#include <cassert>
15#include <cstddef>
16#include <cstdint>
17#include <cstring>
dor1sd6908fb2019-09-11 14:11:08 +000018#include <memory>
19#include <set>
george.karpenkov29efa6d2017-08-21 23:25:50 +000020#include <string>
21#include <vector>
dor1sd6908fb2019-09-11 14:11:08 +000022
george.karpenkov29efa6d2017-08-21 23:25:50 +000023
24// Platform detection.
25#ifdef __linux__
26#define LIBFUZZER_APPLE 0
morehouse400262a2017-12-08 22:54:44 +000027#define LIBFUZZER_FUCHSIA 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000028#define LIBFUZZER_LINUX 1
kamiledcfbba2017-08-30 22:44:11 +000029#define LIBFUZZER_NETBSD 0
kamil21423232018-01-12 17:15:05 +000030#define LIBFUZZER_FREEBSD 0
vitalybuka5f3206d2018-04-09 22:38:26 +000031#define LIBFUZZER_OPENBSD 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000032#define LIBFUZZER_WINDOWS 0
33#elif __APPLE__
34#define LIBFUZZER_APPLE 1
morehouse400262a2017-12-08 22:54:44 +000035#define LIBFUZZER_FUCHSIA 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000036#define LIBFUZZER_LINUX 0
kamiledcfbba2017-08-30 22:44:11 +000037#define LIBFUZZER_NETBSD 0
kamil21423232018-01-12 17:15:05 +000038#define LIBFUZZER_FREEBSD 0
vitalybuka5f3206d2018-04-09 22:38:26 +000039#define LIBFUZZER_OPENBSD 0
kamiledcfbba2017-08-30 22:44:11 +000040#define LIBFUZZER_WINDOWS 0
41#elif __NetBSD__
42#define LIBFUZZER_APPLE 0
morehouse400262a2017-12-08 22:54:44 +000043#define LIBFUZZER_FUCHSIA 0
kamiledcfbba2017-08-30 22:44:11 +000044#define LIBFUZZER_LINUX 0
45#define LIBFUZZER_NETBSD 1
kamil21423232018-01-12 17:15:05 +000046#define LIBFUZZER_FREEBSD 0
vitalybuka5f3206d2018-04-09 22:38:26 +000047#define LIBFUZZER_OPENBSD 0
kamil21423232018-01-12 17:15:05 +000048#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
vitalybuka5f3206d2018-04-09 22:38:26 +000055#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
george.karpenkov29efa6d2017-08-21 23:25:50 +000064#define LIBFUZZER_WINDOWS 0
65#elif _WIN32
66#define LIBFUZZER_APPLE 0
morehouse400262a2017-12-08 22:54:44 +000067#define LIBFUZZER_FUCHSIA 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000068#define LIBFUZZER_LINUX 0
kamiledcfbba2017-08-30 22:44:11 +000069#define LIBFUZZER_NETBSD 0
kamil21423232018-01-12 17:15:05 +000070#define LIBFUZZER_FREEBSD 0
vitalybuka5f3206d2018-04-09 22:38:26 +000071#define LIBFUZZER_OPENBSD 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000072#define LIBFUZZER_WINDOWS 1
morehouse400262a2017-12-08 22:54:44 +000073#elif __Fuchsia__
74#define LIBFUZZER_APPLE 0
75#define LIBFUZZER_FUCHSIA 1
76#define LIBFUZZER_LINUX 0
77#define LIBFUZZER_NETBSD 0
kamil21423232018-01-12 17:15:05 +000078#define LIBFUZZER_FREEBSD 0
vitalybuka5f3206d2018-04-09 22:38:26 +000079#define LIBFUZZER_OPENBSD 0
morehouse400262a2017-12-08 22:54:44 +000080#define LIBFUZZER_WINDOWS 0
george.karpenkov29efa6d2017-08-21 23:25:50 +000081#else
82#error "Support for your platform has not been implemented"
83#endif
84
metzman40132972019-01-09 21:46:09 +000085#if defined(_MSC_VER) && !defined(__clang__)
86// MSVC compiler is being used.
87#define LIBFUZZER_MSVC 1
88#else
89#define LIBFUZZER_MSVC 0
90#endif
91
george.karpenkov29efa6d2017-08-21 23:25:50 +000092#ifndef __has_attribute
93# define __has_attribute(x) 0
94#endif
95
vitalybuka5f3206d2018-04-09 22:38:26 +000096#define LIBFUZZER_POSIX \
97 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \
98 LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
george.karpenkov29efa6d2017-08-21 23:25:50 +000099
100#ifdef __x86_64
101# if __has_attribute(target)
102# define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
103# else
104# define ATTRIBUTE_TARGET_POPCNT
105# endif
106#else
107# define ATTRIBUTE_TARGET_POPCNT
108#endif
109
110
111#ifdef __clang__ // avoid gcc warning.
112# if __has_attribute(no_sanitize)
113# define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
114# else
115# define ATTRIBUTE_NO_SANITIZE_MEMORY
116# endif
117# define ALWAYS_INLINE __attribute__((always_inline))
118#else
119# define ATTRIBUTE_NO_SANITIZE_MEMORY
120# define ALWAYS_INLINE
121#endif // __clang__
122
metzman2fe66e62019-01-17 16:36:05 +0000123#if LIBFUZZER_WINDOWS
124#define ATTRIBUTE_NO_SANITIZE_ADDRESS
125#else
george.karpenkov29efa6d2017-08-21 23:25:50 +0000126#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
metzman2fe66e62019-01-17 16:36:05 +0000127#endif
128
129#if LIBFUZZER_WINDOWS
130#define ATTRIBUTE_ALIGNED(X) __declspec(align(X))
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 static
136#define ATTRIBUTE_NOINLINE __declspec(noinline)
137#else
138#define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X)))
139#define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
140#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \
141 ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local
142
143#define ATTRIBUTE_NOINLINE __attribute__((noinline))
144#endif
george.karpenkov29efa6d2017-08-21 23:25:50 +0000145
146#if defined(__has_feature)
147# if __has_feature(address_sanitizer)
148# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
149# elif __has_feature(memory_sanitizer)
150# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
151# else
152# define ATTRIBUTE_NO_SANITIZE_ALL
153# endif
154#else
155# define ATTRIBUTE_NO_SANITIZE_ALL
156#endif
157
george.karpenkov29efa6d2017-08-21 23:25:50 +0000158namespace fuzzer {
159
160template <class T> T Min(T a, T b) { return a < b ? a : b; }
161template <class T> T Max(T a, T b) { return a > b ? a : b; }
162
163class Random;
164class Dictionary;
165class DictionaryEntry;
166class MutationDispatcher;
167struct FuzzingOptions;
168class InputCorpus;
169struct InputInfo;
170struct ExternalFunctions;
171
172// Global interface to functions that may or may not be available.
173extern ExternalFunctions *EF;
174
george.karpenkovfbfa45c2017-08-27 23:20:09 +0000175// We are using a custom allocator to give a different symbol name to STL
176// containers in order to avoid ODR violations.
177template<typename T>
178 class fuzzer_allocator: public std::allocator<T> {
179 public:
ibiryukov22970222018-06-06 09:22:19 +0000180 fuzzer_allocator() = default;
181
182 template<class U>
183 fuzzer_allocator(const fuzzer_allocator<U>&) {}
184
george.karpenkovfbfa45c2017-08-27 23:20:09 +0000185 template<class Other>
186 struct rebind { typedef fuzzer_allocator<Other> other; };
187 };
188
189template<typename T>
190using Vector = std::vector<T, fuzzer_allocator<T>>;
191
192template<typename T>
193using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
194
195typedef Vector<uint8_t> Unit;
196typedef Vector<Unit> UnitVector;
george.karpenkov29efa6d2017-08-21 23:25:50 +0000197typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
198
199int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
200
george.karpenkov29efa6d2017-08-21 23:25:50 +0000201uint8_t *ExtraCountersBegin();
202uint8_t *ExtraCountersEnd();
203void ClearExtraCounters();
204
morehousec6ee8752018-07-17 16:12:00 +0000205extern bool RunningUserCallback;
206
george.karpenkov29efa6d2017-08-21 23:25:50 +0000207} // namespace fuzzer
208
209#endif // LLVM_FUZZER_DEFS_H