void Fuzzer::Merge(const std::vector<std::string> &Corpora) { if (Corpora.size() <= 1) { Printf("Merge requires two or more corpus dirs\n"); return; } std::vector<std::string> ExtraCorpora(Corpora.begin() + 1, Corpora.end()); assert(Options.MaxLen > 0); UnitVector Initial, Extra; ReadDirToVectorOfUnits(Corpora[0].c_str(), &Initial, nullptr, Options.MaxLen); for (auto &C : ExtraCorpora) ReadDirToVectorOfUnits(C.c_str(), &Extra, nullptr, Options.MaxLen); if (!Initial.empty()) { Printf("=== Minimizing the initial corpus of %zd units\n", Initial.size()); Initial = FindExtraUnits({}, Initial); } Printf("=== Merging extra %zd units\n", Extra.size()); auto Res = FindExtraUnits(Initial, Extra); for (auto &U: Res) WriteToOutputCorpus(U); Printf("=== Merge: written %zd units\n", Res.size()); }
void Fuzzer::RereadOutputCorpus() { if (Options.OutputCorpus.empty()) return; std::vector<Unit> AdditionalCorpus; ReadDirToVectorOfUnits(Options.OutputCorpus.c_str(), &AdditionalCorpus, &EpochOfLastReadOfOutputCorpus); if (Corpus.empty()) { Corpus = AdditionalCorpus; return; } if (!Options.Reload) return; if (Options.Verbosity >= 2) Printf("Reload: read %zd new units.\n", AdditionalCorpus.size()); for (auto &X : AdditionalCorpus) { if (X.size() > (size_t)Options.MaxLen) X.resize(Options.MaxLen); if (UnitHashesAddedToCorpus.insert(Hash(X)).second) { CurrentUnit.clear(); CurrentUnit.insert(CurrentUnit.begin(), X.begin(), X.end()); if (RunOne(CurrentUnit)) { Corpus.push_back(X); if (Options.Verbosity >= 1) PrintStats("RELOAD"); } } } }
void Fuzzer::RereadOutputCorpus(size_t MaxSize) { if (Options.OutputCorpus.empty()) return; std::vector<Unit> AdditionalCorpus; ReadDirToVectorOfUnits(Options.OutputCorpus.c_str(), &AdditionalCorpus, &EpochOfLastReadOfOutputCorpus, MaxSize); if (Corpus.empty()) { Corpus = AdditionalCorpus; return; } if (!Options.Reload) return; if (Options.Verbosity >= 2) Printf("Reload: read %zd new units.\n", AdditionalCorpus.size()); for (auto &X : AdditionalCorpus) { if (X.size() > MaxSize) X.resize(MaxSize); if (UnitHashesAddedToCorpus.insert(Hash(X)).second) { if (RunOne(X)) { Corpus.push_back(X); UpdateCorpusDistribution(); PrintStats("RELOAD"); } } } }
void Fuzzer::RereadOutputCorpus() { if (Options.OutputCorpus.empty()) return; std::vector<Unit> AdditionalCorpus; ReadDirToVectorOfUnits(Options.OutputCorpus.c_str(), &AdditionalCorpus, &EpochOfLastReadOfOutputCorpus); if (Corpus.empty()) { Corpus = AdditionalCorpus; return; } if (!Options.Reload) return; for (auto &X : AdditionalCorpus) { if (X.size() > (size_t)Options.MaxLen) X.resize(Options.MaxLen); if (UnitsAddedAfterInitialLoad.insert(X).second) { Corpus.push_back(X); CurrentUnit.clear(); CurrentUnit.insert(CurrentUnit.begin(), X.begin(), X.end()); size_t NewCoverage = RunOne(CurrentUnit); if (NewCoverage && Options.Verbosity >= 1) PrintStats("RELOAD", NewCoverage); } } }