parent
bf594a5600
commit
1e438a1dba
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -701,6 +701,9 @@ TEST(Merge, Good) {
|
||||||
"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"});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue