osrm-backend/third_party/unordered_dense/test/fuzz/run.h

48 lines
1.3 KiB
C
Raw Normal View History

#pragma once
#include <fuzz/provider.h>
#include <functional>
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
extern "C" {
void HF_ITER(const uint8_t** buf_ptr, size_t* len_ptr);
}
#endif
namespace fuzz {
namespace detail {
void evaluate_corpus(std::function<void(provider)> const& op);
} // namespace detail
/**
* There are 2 modes how this the op() will be executed:
*
* Driven by honggfuzz: this is enabled when compiling with -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION.
* This is done to fuzz a particular test.
*
* Otherwise, this is run in "corpus" mode, where all files in a directory named by the testname are evaluated
* This should be done in normal unit testing. The location of the corpus base directory is determined in this order:
* 1. Use FUZZ_CORPUS_BASE_DIR environment variable
* 2. If this is not set, look in the working directory for a ".fuzz-corpus-base-dir" file which should contain
* the path to the base directory (relative to that particular file)
*/
template <typename Op>
void run(Op const& op) {
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
size_t len = 0;
uint8_t const* buf = nullptr;
while (true) {
::HF_ITER(&buf, &len);
op(provider(buf, len));
}
#else
detail::evaluate_corpus(op);
#endif
}
} // namespace fuzz