Coverage Report

Created: 2018-09-25 14:53

/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