FuzzerDefs.h revision 336817
1133936Sobrien//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
279968Sobrien//
379968Sobrien//                     The LLVM Compiler Infrastructure
4133936Sobrien//
579968Sobrien// This file is distributed under the University of Illinois Open Source
679968Sobrien// License. See LICENSE.TXT for details.
779968Sobrien//
879968Sobrien//===----------------------------------------------------------------------===//
979968Sobrien// Basic definitions.
1079968Sobrien//===----------------------------------------------------------------------===//
1179968Sobrien
1279968Sobrien#ifndef LLVM_FUZZER_DEFS_H
1379968Sobrien#define LLVM_FUZZER_DEFS_H
1479968Sobrien
1579968Sobrien#include <cassert>
1679968Sobrien#include <cstddef>
1779968Sobrien#include <cstdint>
1879968Sobrien#include <cstring>
1979968Sobrien#include <string>
2079968Sobrien#include <vector>
2179968Sobrien#include <set>
2279968Sobrien#include <memory>
2379968Sobrien
2479968Sobrien// Platform detection.
2579968Sobrien#ifdef __linux__
2679968Sobrien#define LIBFUZZER_APPLE 0
2779968Sobrien#define LIBFUZZER_FUCHSIA 0
2879968Sobrien#define LIBFUZZER_LINUX 1
2979968Sobrien#define LIBFUZZER_NETBSD 0
3079968Sobrien#define LIBFUZZER_FREEBSD 0
3179968Sobrien#define LIBFUZZER_OPENBSD 0
3279968Sobrien#define LIBFUZZER_WINDOWS 0
3379968Sobrien#elif __APPLE__
3479968Sobrien#define LIBFUZZER_APPLE 1
3579968Sobrien#define LIBFUZZER_FUCHSIA 0
3679968Sobrien#define LIBFUZZER_LINUX 0
3779968Sobrien#define LIBFUZZER_NETBSD 0
3879968Sobrien#define LIBFUZZER_FREEBSD 0
3979968Sobrien#define LIBFUZZER_OPENBSD 0
4079968Sobrien#define LIBFUZZER_WINDOWS 0
4179968Sobrien#elif __NetBSD__
4279968Sobrien#define LIBFUZZER_APPLE 0
4379968Sobrien#define LIBFUZZER_FUCHSIA 0
4479968Sobrien#define LIBFUZZER_LINUX 0
4579968Sobrien#define LIBFUZZER_NETBSD 1
4679968Sobrien#define LIBFUZZER_FREEBSD 0
4779968Sobrien#define LIBFUZZER_OPENBSD 0
4879968Sobrien#define LIBFUZZER_WINDOWS 0
4979968Sobrien#elif __FreeBSD__
5079968Sobrien#define LIBFUZZER_APPLE 0
51133936Sobrien#define LIBFUZZER_FUCHSIA 0
5279968Sobrien#define LIBFUZZER_LINUX 0
5379968Sobrien#define LIBFUZZER_NETBSD 0
5479968Sobrien#define LIBFUZZER_FREEBSD 1
5579968Sobrien#define LIBFUZZER_OPENBSD 0
5679968Sobrien#define LIBFUZZER_WINDOWS 0
5779968Sobrien#elif __OpenBSD__
5879968Sobrien#define LIBFUZZER_APPLE 0
5979968Sobrien#define LIBFUZZER_FUCHSIA 0
6079968Sobrien#define LIBFUZZER_LINUX 0
6179968Sobrien#define LIBFUZZER_NETBSD 0
6279968Sobrien#define LIBFUZZER_FREEBSD 0
6379968Sobrien#define LIBFUZZER_OPENBSD 1
6479968Sobrien#define LIBFUZZER_WINDOWS 0
6579968Sobrien#elif _WIN32
6679968Sobrien#define LIBFUZZER_APPLE 0
6779968Sobrien#define LIBFUZZER_FUCHSIA 0
6879968Sobrien#define LIBFUZZER_LINUX 0
6979968Sobrien#define LIBFUZZER_NETBSD 0
7079968Sobrien#define LIBFUZZER_FREEBSD 0
7179968Sobrien#define LIBFUZZER_OPENBSD 0
7279968Sobrien#define LIBFUZZER_WINDOWS 1
7379968Sobrien#elif __Fuchsia__
7479968Sobrien#define LIBFUZZER_APPLE 0
7579968Sobrien#define LIBFUZZER_FUCHSIA 1
7679968Sobrien#define LIBFUZZER_LINUX 0
7779968Sobrien#define LIBFUZZER_NETBSD 0
7879968Sobrien#define LIBFUZZER_FREEBSD 0
7979968Sobrien#define LIBFUZZER_OPENBSD 0
8079968Sobrien#define LIBFUZZER_WINDOWS 0
8179968Sobrien#else
8279968Sobrien#error "Support for your platform has not been implemented"
8379968Sobrien#endif
8479968Sobrien
8579968Sobrien#ifndef __has_attribute
8679968Sobrien#  define __has_attribute(x) 0
8779968Sobrien#endif
8879968Sobrien
8979968Sobrien#define LIBFUZZER_POSIX                                                        \
9079968Sobrien  (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD ||                   \
9179968Sobrien   LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
9279968Sobrien
9379968Sobrien#ifdef __x86_64
9479968Sobrien#  if __has_attribute(target)
9579968Sobrien#    define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
9679968Sobrien#  else
9779968Sobrien#    define ATTRIBUTE_TARGET_POPCNT
98108746Sobrien#  endif
99108746Sobrien#else
100133936Sobrien#  define ATTRIBUTE_TARGET_POPCNT
101108746Sobrien#endif
102108746Sobrien
103108746Sobrien
104108746Sobrien#ifdef __clang__  // avoid gcc warning.
105108746Sobrien#  if __has_attribute(no_sanitize)
106108746Sobrien#    define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
107108746Sobrien#  else
108108746Sobrien#    define ATTRIBUTE_NO_SANITIZE_MEMORY
109108746Sobrien#  endif
110108746Sobrien#  define ALWAYS_INLINE __attribute__((always_inline))
111108746Sobrien#else
112108746Sobrien#  define ATTRIBUTE_NO_SANITIZE_MEMORY
113108746Sobrien#  define ALWAYS_INLINE
114108746Sobrien#endif // __clang__
115108746Sobrien
116108746Sobrien#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
117108746Sobrien
118108746Sobrien#if defined(__has_feature)
119108746Sobrien#  if __has_feature(address_sanitizer)
120108746Sobrien#    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
12179968Sobrien#  elif __has_feature(memory_sanitizer)
12279968Sobrien#    define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
12392282Sobrien#  else
12492282Sobrien#    define ATTRIBUTE_NO_SANITIZE_ALL
12592282Sobrien#  endif
12692282Sobrien#else
12792282Sobrien#  define ATTRIBUTE_NO_SANITIZE_ALL
12879968Sobrien#endif
12979968Sobrien
13079968Sobrien#if LIBFUZZER_WINDOWS
13179968Sobrien#define ATTRIBUTE_INTERFACE __declspec(dllexport)
13279968Sobrien#else
13392282Sobrien#define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
13479968Sobrien#endif
13579968Sobrien
13679968Sobriennamespace fuzzer {
13779968Sobrien
13879968Sobrientemplate <class T> T Min(T a, T b) { return a < b ? a : b; }
13979968Sobrientemplate <class T> T Max(T a, T b) { return a > b ? a : b; }
14079968Sobrien
14179968Sobrienclass Random;
14279968Sobrienclass Dictionary;
14379968Sobrienclass DictionaryEntry;
14479968Sobrienclass MutationDispatcher;
14579968Sobrienstruct FuzzingOptions;
14679968Sobrienclass InputCorpus;
14779968Sobrienstruct InputInfo;
14879968Sobrienstruct ExternalFunctions;
14979968Sobrien
15079968Sobrien// Global interface to functions that may or may not be available.
15179968Sobrienextern ExternalFunctions *EF;
15279968Sobrien
15379968Sobrien// We are using a custom allocator to give a different symbol name to STL
15479968Sobrien// containers in order to avoid ODR violations.
15579968Sobrientemplate<typename T>
15679968Sobrien  class fuzzer_allocator: public std::allocator<T> {
15779968Sobrien    public:
15879968Sobrien      fuzzer_allocator() = default;
15979968Sobrien
16079968Sobrien      template<class U>
16179968Sobrien      fuzzer_allocator(const fuzzer_allocator<U>&) {}
16279968Sobrien
16379968Sobrien      template<class Other>
16479968Sobrien      struct rebind { typedef fuzzer_allocator<Other> other;  };
16579968Sobrien  };
16679968Sobrien
16779968Sobrientemplate<typename T>
16879968Sobrienusing Vector = std::vector<T, fuzzer_allocator<T>>;
169110242Sobrien
170110242Sobrientemplate<typename T>
17179968Sobrienusing Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
17279968Sobrien
17379968Sobrientypedef Vector<uint8_t> Unit;
17479968Sobrientypedef Vector<Unit> UnitVector;
17579968Sobrientypedef int (*UserCallback)(const uint8_t *Data, size_t Size);
17679968Sobrien
17779968Sobrienint FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
17879968Sobrien
17979968Sobrieninline uint8_t  Bswap(uint8_t x)  { return x; }
18079968Sobrieninline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
181110242Sobrieninline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
182110242Sobrieninline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
183110242Sobrien
18479968Sobrienuint8_t *ExtraCountersBegin();
18579968Sobrienuint8_t *ExtraCountersEnd();
18679968Sobrienvoid ClearExtraCounters();
18779968Sobrien
18879968Sobrienextern bool RunningUserCallback;
18979968Sobrien
19079968Sobrien}  // namespace fuzzer
19179968Sobrien
19279968Sobrien#endif  // LLVM_FUZZER_DEFS_H
19379968Sobrien