[libFuzzer] use less memory for merge

llvm-svn: 290039
This commit is contained in:
Kostya Serebryany 2016-12-17 08:20:24 +00:00
parent bf594a5600
commit 1e438a1dba
3 changed files with 13 additions and 9 deletions

View File

@ -94,10 +94,11 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) {
return false; return false;
LastSeenStartMarker = kInvalidStartMarker; LastSeenStartMarker = kInvalidStartMarker;
if (ParseCoverage) { if (ParseCoverage) {
while (!ISS1.rdstate()) { auto &V = Files[CurrentFileIdx].Features;
ISS1 >> std::hex >> N; V.clear();
Files[CurrentFileIdx].Features.insert(N); while (ISS1 >> std::hex >> N)
} V.push_back(N);
std::sort(V.begin(), V.end());
} }
} else { } else {
return false; return false;
@ -115,7 +116,7 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) {
size_t Merger::Merge(std::vector<std::string> *NewFiles) { size_t Merger::Merge(std::vector<std::string> *NewFiles) {
NewFiles->clear(); NewFiles->clear();
assert(NumFilesInFirstCorpus <= Files.size()); assert(NumFilesInFirstCorpus <= Files.size());
std::set<size_t> AllFeatures; std::set<uint32_t> AllFeatures;
// What features are in the initial corpus? // What features are in the initial corpus?
for (size_t i = 0; i < NumFilesInFirstCorpus; i++) { for (size_t i = 0; i < NumFilesInFirstCorpus; i++) {
@ -127,7 +128,7 @@ size_t Merger::Merge(std::vector<std::string> *NewFiles) {
// Remove all features that we already know from all other inputs. // Remove all features that we already know from all other inputs.
for (size_t i = NumFilesInFirstCorpus; i < Files.size(); i++) { for (size_t i = NumFilesInFirstCorpus; i < Files.size(); i++) {
auto &Cur = Files[i].Features; auto &Cur = Files[i].Features;
std::set<size_t> Tmp; std::vector<uint32_t> Tmp;
std::set_difference(Cur.begin(), Cur.end(), AllFeatures.begin(), std::set_difference(Cur.begin(), Cur.end(), AllFeatures.begin(),
AllFeatures.end(), std::inserter(Tmp, Tmp.begin())); AllFeatures.end(), std::inserter(Tmp, Tmp.begin()));
Cur.swap(Tmp); Cur.swap(Tmp);

View File

@ -50,7 +50,7 @@ namespace fuzzer {
struct MergeFileInfo { struct MergeFileInfo {
std::string Name; std::string Name;
size_t Size = 0; size_t Size = 0;
std::set<size_t> Features; std::vector<uint32_t> Features;
}; };
struct Merger { struct Merger {

View File

@ -620,7 +620,7 @@ TEST(Merge, Bad) {
} }
} }
void EQ(const std::set<size_t> &A, const std::set<size_t> &B) { void EQ(const std::vector<uint32_t> &A, const std::vector<uint32_t> &B) {
EXPECT_EQ(A, B); EXPECT_EQ(A, B);
} }
@ -699,8 +699,11 @@ TEST(Merge, Good) {
EXPECT_TRUE(M.Parse("3\n1\nA\nB\nC\n" EXPECT_TRUE(M.Parse("3\n1\nA\nB\nC\n"
"STARTED 0 1000\nDONE 0 1 2 3\n" "STARTED 0 1000\nDONE 0 1 2 3\n"
"STARTED 1 1001\nDONE 1 4 5 6 \n" "STARTED 1 1001\nDONE 1 4 5 6 \n"
"STARTED 2 1002\nDONE 2 6 1 3 \n" "STARTED 2 1002\nDONE 2 6 1 3\n"
"", true)); "", true));
EQ(M.Files[0].Features, {1, 2, 3});
EQ(M.Files[1].Features, {4, 5, 6});
EQ(M.Files[2].Features, {1, 3, 6});
EXPECT_EQ(3U, M.Merge(&NewFiles)); EXPECT_EQ(3U, M.Merge(&NewFiles));
EQ(NewFiles, {"B"}); EQ(NewFiles, {"B"});
} }