123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- //===- FuzzerDefs.h - Internal header for the Fuzzer ------------*- C++ -* ===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- // Basic definitions.
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_FUZZER_DEFS_H
- #define LLVM_FUZZER_DEFS_H
- #include <cassert>
- #include <cstddef>
- #include <cstdint>
- #include <cstring>
- #include <memory>
- #include <set>
- #include <string>
- #include <vector>
- // Platform detection.
- #ifdef __linux__
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 1
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 0
- #elif __APPLE__
- #define LIBFUZZER_APPLE 1
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 0
- #elif __NetBSD__
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 1
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 0
- #elif __FreeBSD__
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 1
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 0
- #elif __OpenBSD__
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 1
- #define LIBFUZZER_WINDOWS 0
- #elif _WIN32
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 0
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 1
- #elif __Fuchsia__
- #define LIBFUZZER_APPLE 0
- #define LIBFUZZER_FUCHSIA 1
- #define LIBFUZZER_LINUX 0
- #define LIBFUZZER_NETBSD 0
- #define LIBFUZZER_FREEBSD 0
- #define LIBFUZZER_OPENBSD 0
- #define LIBFUZZER_WINDOWS 0
- #else
- #error "Support for your platform has not been implemented"
- #endif
- #if defined(_MSC_VER) && !defined(__clang__)
- // MSVC compiler is being used.
- #define LIBFUZZER_MSVC 1
- #else
- #define LIBFUZZER_MSVC 0
- #endif
- #ifndef __has_attribute
- # define __has_attribute(x) 0
- #endif
- #define LIBFUZZER_POSIX \
- (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \
- LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD)
- #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__
- #if LIBFUZZER_WINDOWS
- #define ATTRIBUTE_NO_SANITIZE_ADDRESS
- #else
- #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
- #endif
- #if LIBFUZZER_WINDOWS
- #define ATTRIBUTE_ALIGNED(X) __declspec(align(X))
- #define ATTRIBUTE_INTERFACE __declspec(dllexport)
- // This is used for __sancov_lowest_stack which is needed for
- // -fsanitize-coverage=stack-depth. That feature is not yet available on
- // Windows, so make the symbol static to avoid linking errors.
- #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static
- #define ATTRIBUTE_NOINLINE __declspec(noinline)
- #else
- #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X)))
- #define ATTRIBUTE_INTERFACE __attribute__((visibility("default")))
- #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \
- ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local
- #define ATTRIBUTE_NOINLINE __attribute__((noinline))
- #endif
- #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
- 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:
- fuzzer_allocator() = default;
- template<class U>
- fuzzer_allocator(const fuzzer_allocator<U>&) {}
- 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);
- uint8_t *ExtraCountersBegin();
- uint8_t *ExtraCountersEnd();
- void ClearExtraCounters();
- extern bool RunningUserCallback;
- } // namespace fuzzer
- #endif // LLVM_FUZZER_DEFS_H
|