Summary: This code already works and passes some number of tests. There is need to finish remaining sanitizers to get better coverage. Many tests fail due to overly long file names of executables (>31). This is a current shortcoming of the NetBSD 8(beta) kernel, as certain functions can fail (like retrieving file name of executable). Sponsored by <The NetBSD Foundation> Reviewers: joerg, kcc, vitalybuka, george.karpenkov Reviewed By: kcc Subscribers: mgorny, llvm-commits, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D37304 llvm-svn: 312183
158 lines
4.2 KiB
C++
158 lines
4.2 KiB
C++
//===- 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.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_FUZZER_DEFS_H
|
|
#define LLVM_FUZZER_DEFS_H
|
|
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <set>
|
|
#include <memory>
|
|
|
|
// Platform detection.
|
|
#ifdef __linux__
|
|
#define LIBFUZZER_APPLE 0
|
|
#define LIBFUZZER_LINUX 1
|
|
#define LIBFUZZER_NETBSD 0
|
|
#define LIBFUZZER_WINDOWS 0
|
|
#elif __APPLE__
|
|
#define LIBFUZZER_APPLE 1
|
|
#define LIBFUZZER_LINUX 0
|
|
#define LIBFUZZER_NETBSD 0
|
|
#define LIBFUZZER_WINDOWS 0
|
|
#elif __NetBSD__
|
|
#define LIBFUZZER_APPLE 0
|
|
#define LIBFUZZER_LINUX 0
|
|
#define LIBFUZZER_NETBSD 1
|
|
#define LIBFUZZER_WINDOWS 0
|
|
#elif _WIN32
|
|
#define LIBFUZZER_APPLE 0
|
|
#define LIBFUZZER_LINUX 0
|
|
#define LIBFUZZER_NETBSD 0
|
|
#define LIBFUZZER_WINDOWS 1
|
|
#else
|
|
#error "Support for your platform has not been implemented"
|
|
#endif
|
|
|
|
#ifndef __has_attribute
|
|
# define __has_attribute(x) 0
|
|
#endif
|
|
|
|
#define LIBFUZZER_POSIX (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD)
|
|
|
|
#ifdef __x86_64
|
|
# if __has_attribute(target)
|
|
# define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt")))
|
|
# else
|
|
# define ATTRIBUTE_TARGET_POPCNT
|
|
# endif
|
|
#else
|
|
# define ATTRIBUTE_TARGET_POPCNT
|
|
#endif
|
|
|
|
|
|
#ifdef __clang__ // avoid gcc warning.
|
|
# if __has_attribute(no_sanitize)
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
|
|
# else
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY
|
|
# endif
|
|
# define ALWAYS_INLINE __attribute__((always_inline))
|
|
#else
|
|
# define ATTRIBUTE_NO_SANITIZE_MEMORY
|
|
# define ALWAYS_INLINE
|
|
#endif // __clang__
|
|
|
|
#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
|
|
|
|
#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
|
|
|
|
#if LIBFUZZER_WINDOWS
|
|
#define ATTRIBUTE_INTERFACE __declspec(dllexport)
|
|
#else
|
|
#define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
namespace fuzzer {
|
|
|
|
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; }
|
|
|
|
class Random;
|
|
class Dictionary;
|
|
class DictionaryEntry;
|
|
class MutationDispatcher;
|
|
struct FuzzingOptions;
|
|
class InputCorpus;
|
|
struct InputInfo;
|
|
struct ExternalFunctions;
|
|
|
|
// Global interface to functions that may or may not be available.
|
|
extern ExternalFunctions *EF;
|
|
|
|
// We are using a custom allocator to give a different symbol name to STL
|
|
// containers in order to avoid ODR violations.
|
|
template<typename T>
|
|
class fuzzer_allocator: public std::allocator<T> {
|
|
public:
|
|
template<class Other>
|
|
struct rebind { typedef fuzzer_allocator<Other> other; };
|
|
};
|
|
|
|
template<typename T>
|
|
using Vector = std::vector<T, fuzzer_allocator<T>>;
|
|
|
|
template<typename T>
|
|
using Set = std::set<T, std::less<T>, fuzzer_allocator<T>>;
|
|
|
|
typedef Vector<uint8_t> Unit;
|
|
typedef Vector<Unit> UnitVector;
|
|
typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
|
|
|
|
int FuzzerDriver(int *argc, char ***argv, UserCallback Callback);
|
|
|
|
struct ScopedDoingMyOwnMemOrStr {
|
|
ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr++; }
|
|
~ScopedDoingMyOwnMemOrStr() { DoingMyOwnMemOrStr--; }
|
|
static int DoingMyOwnMemOrStr;
|
|
};
|
|
|
|
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); }
|
|
|
|
uint8_t *ExtraCountersBegin();
|
|
uint8_t *ExtraCountersEnd();
|
|
void ClearExtraCounters();
|
|
|
|
uint64_t *ClangCountersBegin();
|
|
uint64_t *ClangCountersEnd();
|
|
void ClearClangCounters();
|
|
|
|
} // namespace fuzzer
|
|
|
|
#endif // LLVM_FUZZER_DEFS_H
|