diff options
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerCorpus.h | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerCorpus.h b/llvm/lib/Fuzzer/FuzzerCorpus.h index 382980b9fee..5899c677085 100644 --- a/llvm/lib/Fuzzer/FuzzerCorpus.h +++ b/llvm/lib/Fuzzer/FuzzerCorpus.h @@ -36,25 +36,28 @@ class InputCorpus { public: static const size_t kFeatureSetSize = 1 << 16; InputCorpus() { - Inputs.reserve(1 << 14); // Avoid too many resizes. memset(InputSizesPerFeature, 0, sizeof(InputSizesPerFeature)); memset(SmallestElementPerFeature, 0, sizeof(SmallestElementPerFeature)); } + ~InputCorpus() { + for (auto II : Inputs) + delete II; + } size_t size() const { return Inputs.size(); } size_t SizeInBytes() const { size_t Res = 0; - for (auto &II : Inputs) - Res += II.U.size(); + for (auto II : Inputs) + Res += II->U.size(); return Res; } size_t NumActiveUnits() const { size_t Res = 0; - for (auto &II : Inputs) - Res += !II.U.empty(); + for (auto II : Inputs) + Res += !II->U.empty(); return Res; } bool empty() const { return Inputs.empty(); } - const Unit &operator[] (size_t Idx) const { return Inputs[Idx].U; } + const Unit &operator[] (size_t Idx) const { return Inputs[Idx]->U; } void AddToCorpus(const Unit &U, size_t NumFeatures) { assert(!U.empty()); uint8_t Hash[kSHA1NumBytes]; @@ -62,8 +65,8 @@ class InputCorpus { Printf("ADD_TO_CORPUS %zd NF %zd\n", Inputs.size(), NumFeatures); ComputeSHA1(U.data(), U.size(), Hash); Hashes.insert(Sha1ToString(Hash)); - Inputs.push_back(InputInfo()); - InputInfo &II = Inputs.back(); + Inputs.push_back(new InputInfo()); + InputInfo &II = *Inputs.back(); II.U = U; II.NumFeatures = NumFeatures; memcpy(II.Sha1, Hash, kSHA1NumBytes); @@ -71,14 +74,10 @@ class InputCorpus { ValidateFeatureSet(); } - typedef const std::vector<InputInfo>::const_iterator ConstIter; - ConstIter begin() const { return Inputs.begin(); } - ConstIter end() const { return Inputs.end(); } - bool HasUnit(const Unit &U) { return Hashes.count(Hash(U)); } bool HasUnit(const std::string &H) { return Hashes.count(H); } InputInfo &ChooseUnitToMutate(Random &Rand) { - InputInfo &II = Inputs[ChooseUnitIdxToMutate(Rand)]; + InputInfo &II = *Inputs[ChooseUnitIdxToMutate(Rand)]; assert(!II.U.empty()); return II; }; @@ -94,7 +93,7 @@ class InputCorpus { void PrintStats() { for (size_t i = 0; i < Inputs.size(); i++) { - const auto &II = Inputs[i]; + const auto &II = *Inputs[i]; Printf(" [%zd %s]\tsz: %zd\truns: %zd\tsucc: %zd\n", i, Sha1ToString(II.Sha1).c_str(), II.U.size(), II.NumExecutedMutations, II.NumSuccessfullMutations); @@ -108,7 +107,7 @@ class InputCorpus { } Printf("\n\t"); for (size_t i = 0; i < Inputs.size(); i++) - if (size_t N = Inputs[i].NumFeatures) + if (size_t N = Inputs[i]->NumFeatures) Printf(" %zd=>%zd ", i, N); Printf("\n"); } @@ -119,7 +118,7 @@ class InputCorpus { uint32_t OldSize = GetFeature(Idx); if (OldSize == 0 || (Shrink && OldSize > NewSize)) { if (OldSize > 0) { - InputInfo &II = Inputs[SmallestElementPerFeature[Idx]]; + InputInfo &II = *Inputs[SmallestElementPerFeature[Idx]]; assert(II.NumFeatures > 0); II.NumFeatures--; if (II.NumFeatures == 0) { @@ -157,12 +156,12 @@ private: PrintFeatureSet(); for (size_t Idx = 0; Idx < kFeatureSetSize; Idx++) if (GetFeature(Idx)) - Inputs[SmallestElementPerFeature[Idx]].Tmp++; - for (auto &II: Inputs) { - if (II.Tmp != II.NumFeatures) - Printf("ZZZ %zd %zd\n", II.Tmp, II.NumFeatures); - assert(II.Tmp == II.NumFeatures); - II.Tmp = 0; + Inputs[SmallestElementPerFeature[Idx]]->Tmp++; + for (auto II: Inputs) { + if (II->Tmp != II->NumFeatures) + Printf("ZZZ %zd %zd\n", II->Tmp, II->NumFeatures); + assert(II->Tmp == II->NumFeatures); + II->Tmp = 0; } } @@ -175,7 +174,7 @@ private: std::iota(Intervals.begin(), Intervals.end(), 0); if (CountingFeatures) for (size_t i = 0; i < N; i++) - Weights[i] = Inputs[i].NumFeatures * (i + 1); + Weights[i] = Inputs[i]->NumFeatures * (i + 1); else std::iota(Weights.begin(), Weights.end(), 1); CorpusDistribution = std::piecewise_constant_distribution<double>( @@ -187,7 +186,7 @@ private: std::vector<double> Weights; std::unordered_set<std::string> Hashes; - std::vector<InputInfo> Inputs; + std::vector<InputInfo*> Inputs; bool CountingFeatures = false; uint32_t InputSizesPerFeature[kFeatureSetSize]; |