/src/mozilla-central/tools/fuzzing/libfuzzer/FuzzerDefs.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | #define LIBFUZZER_APPLE 0 |
27 | | #define LIBFUZZER_FUCHSIA 0 |
28 | 1.63k | #define LIBFUZZER_LINUX 1 |
29 | 815 | #define LIBFUZZER_NETBSD 0 |
30 | 815 | #define LIBFUZZER_FREEBSD 0 |
31 | 0 | #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 | | |
143 | | namespace fuzzer { |
144 | | |
145 | 26.6k | template <class T> T Min(T a, T b) { return a < b ? a : b; } |
146 | 16.2k | template <class T> T Max(T a, T b) { return a > b ? a : b; } |
147 | | |
148 | | class Random; |
149 | | class Dictionary; |
150 | | class DictionaryEntry; |
151 | | class MutationDispatcher; |
152 | | struct FuzzingOptions; |
153 | | class InputCorpus; |
154 | | struct InputInfo; |
155 | | struct ExternalFunctions; |
156 | | |
157 | | // Global interface to functions that may or may not be available. |
158 | | extern 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. |
162 | | template<typename T> |
163 | | class fuzzer_allocator: public std::allocator<T> { |
164 | | public: |
165 | 68.4k | fuzzer_allocator() = default; fuzzer::fuzzer_allocator<fuzzer::SizedFile>::fuzzer_allocator() Line | Count | Source | 165 | 3 | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<unsigned char>::fuzzer_allocator() Line | Count | Source | 165 | 47.5k | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::fuzzer_allocator() Line | Count | Source | 165 | 9 | fuzzer_allocator() = default; |
Unexecuted instantiation: fuzzer::fuzzer_allocator<std::__1::thread>::fuzzer_allocator() fuzzer::fuzzer_allocator<double>::fuzzer_allocator() Line | Count | Source | 165 | 6 | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<fuzzer::InputInfo*>::fuzzer_allocator() Line | Count | Source | 165 | 3 | fuzzer_allocator() = default; |
Unexecuted instantiation: fuzzer::fuzzer_allocator<int>::fuzzer_allocator() fuzzer::fuzzer_allocator<unsigned long>::fuzzer_allocator() Line | Count | Source | 165 | 10.4k | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<std::__1::vector<unsigned char, fuzzer::fuzzer_allocator<unsigned char> > >::fuzzer_allocator() Line | Count | Source | 165 | 3 | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<unsigned int>::fuzzer_allocator() Line | Count | Source | 165 | 10.4k | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<std::__1::__tree_node<unsigned long, void*> >::fuzzer_allocator() Line | Count | Source | 165 | 3 | fuzzer_allocator() = default; |
Unexecuted instantiation: fuzzer::fuzzer_allocator<fuzzer::MergeFileInfo>::fuzzer_allocator() Unexecuted instantiation: fuzzer::fuzzer_allocator<std::__1::__tree_node<unsigned int, void*> >::fuzzer_allocator() fuzzer::fuzzer_allocator<fuzzer::DictionaryEntry*>::fuzzer_allocator() Line | Count | Source | 165 | 3 | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<fuzzer::MutationDispatcher::Mutator>::fuzzer_allocator() Line | Count | Source | 165 | 9 | fuzzer_allocator() = default; |
fuzzer::fuzzer_allocator<fuzzer::DictionaryEntry>::fuzzer_allocator() Line | Count | Source | 165 | 3 | 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 | | |
174 | | template<typename T> |
175 | | using Vector = std::vector<T, fuzzer_allocator<T>>; |
176 | | |
177 | | template<typename T> |
178 | | using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>; |
179 | | |
180 | | typedef Vector<uint8_t> Unit; |
181 | | typedef Vector<Unit> UnitVector; |
182 | | typedef int (*UserCallback)(const uint8_t *Data, size_t Size); |
183 | | |
184 | | int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); |
185 | | |
186 | 0 | inline uint8_t Bswap(uint8_t x) { return x; } |
187 | 0 | inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); } |
188 | 0 | inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); } |
189 | 0 | inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); } |
190 | | |
191 | | uint8_t *ExtraCountersBegin(); |
192 | | uint8_t *ExtraCountersEnd(); |
193 | | void ClearExtraCounters(); |
194 | | |
195 | | extern bool RunningUserCallback; |
196 | | |
197 | | } // namespace fuzzer |
198 | | |
199 | | #endif // LLVM_FUZZER_DEFS_H |