blob: 02e25f673846e7344cf0938e4f97bdf36c5a5466 [file] [log] [blame]
george.karpenkov29efa6d2017-08-21 23:25:50 +00001//===- 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>
george.karpenkovfbfa45c2017-08-27 23:20:09 +000021#include <set>
22#include <memory>
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
85#ifndef __has_attribute
86# define __has_attribute(x) 0
87#endif
88
vitalybuka5f3206d2018-04-09 22:38:26 +000089#define LIBFUZZER_POSIX \
90 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \
91 LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
george.karpenkov29efa6d2017-08-21 23:25:50 +000092
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#else
133#define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
134#endif
135
136namespace fuzzer {
137
138template <class T> T Min(T a, T b) { return a < b ? a : b; }
139template <class T> T Max(T a, T b) { return a > b ? a : b; }
140
141class Random;
142class Dictionary;
143class DictionaryEntry;
144class MutationDispatcher;
145struct FuzzingOptions;
146class InputCorpus;
147struct InputInfo;
148struct ExternalFunctions;
149
150// Global interface to functions that may or may not be available.
151extern ExternalFunctions *EF;
152
george.karpenkovfbfa45c2017-08-27 23:20:09 +0000153// We are using a custom allocator to give a different symbol name to STL
154// containers in order to avoid ODR violations.
155template<typename T>
156 class fuzzer_allocator: public std::allocator<T> {
157 public:
158 template<class Other>
159 struct rebind { typedef fuzzer_allocator<Other> other; };
160 };
161
162template<typename T>
163using Vector = std::vector<T, fuzzer_allocator<T>>;
164
165template<typename T>
166using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
167
168typedef Vector<uint8_t> Unit;
169typedef Vector<Unit> UnitVector;
george.karpenkov29efa6d2017-08-21 23:25:50 +0000170typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
171
172int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
173
174struct ScopedDoingMyOwnMemOrStr {
175 ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
176 ~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
177 static int DoingMyOwnMemOrStr;
178};
179
180inline uint8_t Bswap(uint8_t x) { return x; }
181inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
182inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
183inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
184
185uint8_t *ExtraCountersBegin();
186uint8_t *ExtraCountersEnd();
187void ClearExtraCounters();
188
kcc1c0379f2017-08-22 01:28:32 +0000189uint64_t *ClangCountersBegin();
190uint64_t *ClangCountersEnd();
191void ClearClangCounters();
192
george.karpenkov29efa6d2017-08-21 23:25:50 +0000193} // namespace fuzzer
194
195#endif // LLVM_FUZZER_DEFS_H