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::Merge(const std::vector<std::string> &Corpora) { if (Corpora.size() <= 1) { Printf("Merge requires two or more corpus dirs\n"); return; } auto InitialCorpusDir = Corpora[0]; ReadDir(InitialCorpusDir, nullptr); Printf("Merge: running the initial corpus '%s' of %d units\n", InitialCorpusDir.c_str(), Corpus.size()); for (auto &U : Corpus) RunOne(U); std::vector<std::string> ExtraCorpora(Corpora.begin() + 1, Corpora.end()); size_t NumTried = 0; size_t NumMerged = 0; for (auto &C : ExtraCorpora) { Corpus.clear(); ReadDir(C, nullptr); Printf("Merge: merging the extra corpus '%s' of %zd units\n", C.c_str(), Corpus.size()); for (auto &U : Corpus) { NumTried++; if (RunOne(U)) { WriteToOutputCorpus(U); NumMerged++; } } } Printf("Merge: written %zd out of %zd units\n", NumMerged, NumTried); }