git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237617
91177308-0d34-0410-b5e6-
96231b3b80d8
Options.MaxNumberOfRuns = Flags.runs;
if (!inputs.empty())
Options.OutputCorpus = inputs[0];
Options.MaxNumberOfRuns = Flags.runs;
if (!inputs.empty())
Options.OutputCorpus = inputs[0];
+ if (Flags.sync_command)
+ Options.SyncCommand = Flags.sync_command;
+ Options.SyncTimeout = Flags.sync_timeout;
Fuzzer F(Callback, Options);
unsigned seed = Flags.seed;
Fuzzer F(Callback, Options);
unsigned seed = Flags.seed;
" fuzz a token based input language.")
FUZZER_FLAG_STRING(apply_tokens, "Read the given input file, substitute bytes "
" with tokens and write the result to stdout.")
" fuzz a token based input language.")
FUZZER_FLAG_STRING(apply_tokens, "Read the given input file, substitute bytes "
" with tokens and write the result to stdout.")
+FUZZER_FLAG_STRING(sync_command, "Execute an external command "
+ "\"<sync_command> <test_corpus>\" "
+ "to synchronize the test corpus.")
+FUZZER_FLAG_INT(sync_timeout, 600, "Minimal timeout between syncs.")
void PrintFileAsBase64(const std::string &Path) {
std::string Cmd = "base64 -w 0 < " + Path + "; echo";
void PrintFileAsBase64(const std::string &Path) {
std::string Cmd = "base64 -w 0 < " + Path + "; echo";
std::string Hash(const Unit &U);
void SetTimer(int Seconds);
void PrintFileAsBase64(const std::string &Path);
std::string Hash(const Unit &U);
void SetTimer(int Seconds);
void PrintFileAsBase64(const std::string &Path);
+void ExecuteCommand(const std::string &Command);
// Private copy of SHA1 implementation.
static const int kSHA1NumBytes = 20;
// Private copy of SHA1 implementation.
static const int kSHA1NumBytes = 20;
bool Reload = true;
int PreferSmallDuringInitialShuffle = -1;
size_t MaxNumberOfRuns = ULONG_MAX;
bool Reload = true;
int PreferSmallDuringInitialShuffle = -1;
size_t MaxNumberOfRuns = ULONG_MAX;
std::string OutputCorpus;
std::string OutputCorpus;
+ std::string SyncCommand;
std::vector<std::string> Tokens;
};
Fuzzer(UserCallback Callback, FuzzingOptions Options);
std::vector<std::string> Tokens;
};
Fuzzer(UserCallback Callback, FuzzingOptions Options);
void PrintStats(const char *Where, size_t Cov, const char *End = "\n");
void PrintUnitInASCIIOrTokens(const Unit &U, const char *PrintAfter = "");
void PrintStats(const char *Where, size_t Cov, const char *End = "\n");
void PrintUnitInASCIIOrTokens(const Unit &U, const char *PrintAfter = "");
// Trace-based fuzzing: we run a unit with some kind of tracing
// enabled and record potentially useful mutations. Then
// We apply these mutations one by one to the unit and run it again.
// Trace-based fuzzing: we run a unit with some kind of tracing
// enabled and record potentially useful mutations. Then
// We apply these mutations one by one to the unit and run it again.
UserCallback Callback;
FuzzingOptions Options;
system_clock::time_point ProcessStartTime = system_clock::now();
UserCallback Callback;
FuzzingOptions Options;
system_clock::time_point ProcessStartTime = system_clock::now();
+ system_clock::time_point LastExternalSync = system_clock::now();
system_clock::time_point UnitStartTime;
long TimeOfLongestUnitInSeconds = 0;
long EpochOfLastReadOfOutputCorpus = 0;
system_clock::time_point UnitStartTime;
long TimeOfLongestUnitInSeconds = 0;
long EpochOfLastReadOfOutputCorpus = 0;
void Fuzzer::Loop(size_t NumIterations) {
for (size_t i = 1; i <= NumIterations; i++) {
for (size_t J1 = 0; J1 < Corpus.size(); J1++) {
void Fuzzer::Loop(size_t NumIterations) {
for (size_t i = 1; i <= NumIterations; i++) {
for (size_t J1 = 0; J1 < Corpus.size(); J1++) {
RereadOutputCorpus();
if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
return;
RereadOutputCorpus();
if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
return;
+void Fuzzer::SyncCorpus() {
+ if (Options.SyncCommand.empty() || Options.OutputCorpus.empty()) return;
+ auto Now = system_clock::now();
+ if (duration_cast<seconds>(Now - LastExternalSync).count() <
+ Options.SyncTimeout)
+ return;
+ LastExternalSync = Now;
+ ExecuteCommand(Options.SyncCommand + " " + Options.OutputCorpus);
+}
+
+void ExecuteCommand(const std::string &Command) {
+ system(Command.c_str());
+}
+