2016-09-21 01:50:50 +00:00
|
|
|
//===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Basic definitions.
|
|
|
|
//===----------------------------------------------------------------------===//
|
2016-12-13 17:46:11 +00:00
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
#ifndef LLVM_FUZZER_DEFS_H
|
|
|
|
#define LLVM_FUZZER_DEFS_H
|
|
|
|
|
2016-09-21 02:05:39 +00:00
|
|
|
#include <cassert>
|
2016-09-21 01:50:50 +00:00
|
|
|
#include <cstddef>
|
|
|
|
#include <cstdint>
|
2016-09-21 21:17:23 +00:00
|
|
|
#include <cstring>
|
2016-09-21 01:50:50 +00:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
// Platform detection.
|
|
|
|
#ifdef __linux__
|
|
|
|
#define LIBFUZZER_APPLE 0
|
2016-11-30 16:32:54 +00:00
|
|
|
#define LIBFUZZER_LINUX 1
|
|
|
|
#define LIBFUZZER_WINDOWS 0
|
2016-09-21 01:50:50 +00:00
|
|
|
#elif __APPLE__
|
|
|
|
#define LIBFUZZER_APPLE 1
|
2016-11-30 16:32:54 +00:00
|
|
|
#define LIBFUZZER_LINUX 0
|
|
|
|
#define LIBFUZZER_WINDOWS 0
|
|
|
|
#elif _WIN32
|
|
|
|
#define LIBFUZZER_APPLE 0
|
|
|
|
#define LIBFUZZER_LINUX 0
|
|
|
|
#define LIBFUZZER_WINDOWS 1
|
2016-09-21 01:50:50 +00:00
|
|
|
#else
|
|
|
|
#error "Support for your platform has not been implemented"
|
|
|
|
#endif
|
|
|
|
|
2017-04-21 16:57:37 +00:00
|
|
|
#ifndef __has_attribute
|
|
|
|
# define __has_attribute(x) 0
|
|
|
|
#endif
|
|
|
|
|
2016-11-30 16:32:54 +00:00
|
|
|
#define LIBFUZZER_POSIX LIBFUZZER_APPLE || LIBFUZZER_LINUX
|
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
#ifdef __x86_64
|
2017-04-21 16:57:37 +00:00
|
|
|
# if __has_attribute(target)
|
|
|
|
# define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_TARGET_POPCNT
|
|
|
|
# endif
|
2016-09-21 01:50:50 +00:00
|
|
|
#else
|
2017-04-21 16:57:37 +00:00
|
|
|
# define ATTRIBUTE_TARGET_POPCNT
|
2016-09-21 01:50:50 +00:00
|
|
|
#endif
|
|
|
|
|
2016-12-16 22:45:25 +00:00
|
|
|
|
|
|
|
#ifdef __clang__ // avoid gcc warning.
|
2017-04-21 22:58:55 +00:00
|
|
|
# if __has_attribute(no_sanitize)
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY
|
|
|
|
# endif
|
2017-01-17 23:11:32 +00:00
|
|
|
# define ALWAYS_INLINE __attribute__((always_inline))
|
2016-12-16 22:45:25 +00:00
|
|
|
#else
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY
|
2017-01-17 23:11:32 +00:00
|
|
|
# define ALWAYS_INLINE
|
|
|
|
#endif // __clang__
|
2016-12-16 22:45:25 +00:00
|
|
|
|
2017-01-26 01:04:54 +00:00
|
|
|
#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
|
|
|
|
|
2017-03-23 22:43:12 +00:00
|
|
|
#if defined(__has_feature)
|
|
|
|
# if __has_feature(address_sanitizer)
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS
|
|
|
|
# elif __has_feature(memory_sanitizer)
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_ALL
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# define ATTRIBUTE_NO_SANITIZE_ALL
|
|
|
|
#endif
|
2017-01-26 01:04:54 +00:00
|
|
|
|
2017-01-22 01:27:38 +00:00
|
|
|
#if LIBFUZZER_WINDOWS
|
|
|
|
#define ATTRIBUTE_INTERFACE __declspec(dllexport)
|
|
|
|
#else
|
|
|
|
#define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
|
|
|
|
#endif
|
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
namespace fuzzer {
|
|
|
|
|
2016-09-23 00:22:46 +00:00
|
|
|
template <class T> T Min(T a, T b) { return a < b ? a : b; }
|
|
|
|
template <class T> T Max(T a, T b) { return a > b ? a : b; }
|
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
class Random;
|
|
|
|
class Dictionary;
|
|
|
|
class DictionaryEntry;
|
|
|
|
class MutationDispatcher;
|
2016-09-21 02:05:39 +00:00
|
|
|
struct FuzzingOptions;
|
|
|
|
class InputCorpus;
|
2016-09-21 22:42:17 +00:00
|
|
|
struct InputInfo;
|
2016-09-21 02:05:39 +00:00
|
|
|
struct ExternalFunctions;
|
|
|
|
|
|
|
|
// Global interface to functions that may or may not be available.
|
|
|
|
extern ExternalFunctions *EF;
|
2016-09-21 01:50:50 +00:00
|
|
|
|
|
|
|
typedef std::vector<uint8_t> Unit;
|
|
|
|
typedef std::vector<Unit> UnitVector;
|
|
|
|
typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
|
|
|
|
|
2016-11-30 19:06:14 +00:00
|
|
|
int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
|
2016-10-14 20:20:33 +00:00
|
|
|
|
2017-03-31 02:21:28 +00:00
|
|
|
struct ScopedDoingMyOwnMemOrStr {
|
|
|
|
ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
|
|
|
|
~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
|
|
|
|
static int DoingMyOwnMemOrStr;
|
2016-10-14 20:20:33 +00:00
|
|
|
};
|
|
|
|
|
2016-10-15 04:00:07 +00:00
|
|
|
inline uint8_t Bswap(uint8_t x) { return x; }
|
|
|
|
inline uint16_t Bswap(uint16_t x) { return __builtin_bswap16(x); }
|
|
|
|
inline uint32_t Bswap(uint32_t x) { return __builtin_bswap32(x); }
|
|
|
|
inline uint64_t Bswap(uint64_t x) { return __builtin_bswap64(x); }
|
|
|
|
|
2017-03-23 22:43:12 +00:00
|
|
|
uint8_t *ExtraCountersBegin();
|
|
|
|
uint8_t *ExtraCountersEnd();
|
|
|
|
void ClearExtraCounters();
|
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
} // namespace fuzzer
|
2016-12-13 17:46:11 +00:00
|
|
|
|
2016-09-21 01:50:50 +00:00
|
|
|
#endif // LLVM_FUZZER_DEFS_H
|