[llvm] r260829 - [libFuzzer] remove std::vector operations from hot paths, NFC
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 16 16:13:04 PST 2016
On Sat, Feb 13, 2016 at 9:56 AM, Kostya Serebryany via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: kcc
> Date: Sat Feb 13 11:56:51 2016
> New Revision: 260829
>
> URL: http://llvm.org/viewvc/llvm-project?rev=260829&view=rev
> Log:
> [libFuzzer] remove std::vector operations from hot paths, NFC
>
> Modified:
> llvm/trunk/lib/Fuzzer/FuzzerDriver.cpp
> llvm/trunk/lib/Fuzzer/FuzzerInternal.h
> llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp
> llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp
> llvm/trunk/lib/Fuzzer/FuzzerUtil.cpp
>
> Modified: llvm/trunk/lib/Fuzzer/FuzzerDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerDriver.cpp?rev=260829&r1=260828&r2=260829&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Fuzzer/FuzzerDriver.cpp (original)
> +++ llvm/trunk/lib/Fuzzer/FuzzerDriver.cpp Sat Feb 13 11:56:51 2016
> @@ -229,7 +229,7 @@ int RunOneTest(Fuzzer *F, const char *In
> Unit U = FileToVector(InputFilePath);
> Unit PreciseSizedU(U);
> assert(PreciseSizedU.size() == PreciseSizedU.capacity());
> - F->ExecuteCallback(PreciseSizedU);
> + F->ExecuteCallback(PreciseSizedU.data(), PreciseSizedU.size());
>
Could this be ArrayRef instead - then the call site wouldn't need to change?
> return 0;
> }
>
>
> Modified: llvm/trunk/lib/Fuzzer/FuzzerInternal.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerInternal.h?rev=260829&r1=260828&r2=260829&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Fuzzer/FuzzerInternal.h (original)
> +++ llvm/trunk/lib/Fuzzer/FuzzerInternal.h Sat Feb 13 11:56:51 2016
> @@ -93,7 +93,7 @@ void ComputeSHA1(const uint8_t *Data, si
>
> // Changes U to contain only ASCII (isprint+isspace) characters.
> // Returns true iff U has been changed.
> -bool ToASCII(Unit &U);
> +bool ToASCII(uint8_t *Data, size_t Size);
> bool IsASCII(const Unit &U);
>
> int NumberOfCpuCores();
> @@ -251,6 +251,7 @@ private:
> std::vector<Mutator> CurrentMutatorSequence;
> std::vector<DictionaryEntry *> CurrentDictionaryEntrySequence;
> const std::vector<Unit> *Corpus = nullptr;
> + std::vector<uint8_t> MutateInPlaceHere;
>
> static Mutator Mutators[];
> };
> @@ -318,7 +319,7 @@ public:
>
> static void StaticAlarmCallback();
>
> - void ExecuteCallback(const Unit &U);
> + void ExecuteCallback(const uint8_t *Data, size_t Size);
>
> // Merge Corpora[1:] into Corpora[0].
> void Merge(const std::vector<std::string> &Corpora);
> @@ -328,8 +329,9 @@ private:
> void AlarmCallback();
> void MutateAndTestOne();
> void ReportNewCoverage(const Unit &U);
> - bool RunOne(const Unit &U);
> - void RunOneAndUpdateCorpus(Unit &U);
> + bool RunOne(const uint8_t *Data, size_t Size);
> + bool RunOne(const Unit &U) { return RunOne(U.data(), U.size()); }
> + void RunOneAndUpdateCorpus(uint8_t *Data, size_t Size);
> void WriteToOutputCorpus(const Unit &U);
> void WriteUnitToFileWithPrefix(const Unit &U, const char *Prefix);
> void PrintStats(const char *Where, const char *End = "\n");
> @@ -376,6 +378,8 @@ private:
> return Res;
> }
>
> + std::vector<uint8_t> MutateInPlaceHere;
> +
> std::piecewise_constant_distribution<double> CorpusDistribution;
> UserCallback CB;
> MutationDispatcher &MD;
>
> Modified: llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp?rev=260829&r1=260828&r2=260829&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp (original)
> +++ llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp Sat Feb 13 11:56:51 2016
> @@ -208,7 +208,7 @@ void Fuzzer::ShuffleAndMinimize() {
> size_t Last = std::min(First + Options.MaxLen, C.size());
> U.insert(U.begin(), C.begin() + First, C.begin() + Last);
> if (Options.OnlyASCII)
> - ToASCII(U);
> + ToASCII(U.data(), U.size());
> if (RunOne(U)) {
> NewCorpus.push_back(U);
> if (Options.Verbosity >= 2)
> @@ -223,12 +223,12 @@ void Fuzzer::ShuffleAndMinimize() {
> PrintStats("INITED");
> }
>
> -bool Fuzzer::RunOne(const Unit &U) {
> +bool Fuzzer::RunOne(const uint8_t *Data, size_t Size) {
> UnitStartTime = system_clock::now();
> TotalNumberOfRuns++;
>
> PrepareCoverageBeforeRun();
> - ExecuteCallback(U);
> + ExecuteCallback(Data, Size);
> bool Res = CheckCoverageAfterRun();
>
> auto UnitStopTime = system_clock::now();
> @@ -241,29 +241,29 @@ bool Fuzzer::RunOne(const Unit &U) {
> TimeOfUnit >= Options.ReportSlowUnits) {
> TimeOfLongestUnitInSeconds = TimeOfUnit;
> Printf("Slowest unit: %zd s:\n", TimeOfLongestUnitInSeconds);
> - WriteUnitToFileWithPrefix(U, "slow-unit-");
> + WriteUnitToFileWithPrefix({Data, Data + Size}, "slow-unit-");
> }
> return Res;
> }
>
> -void Fuzzer::RunOneAndUpdateCorpus(Unit &U) {
> +void Fuzzer::RunOneAndUpdateCorpus(uint8_t *Data, size_t Size) {
> if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
> return;
> if (Options.OnlyASCII)
> - ToASCII(U);
> - if (RunOne(U))
> - ReportNewCoverage(U);
> + ToASCII(Data, Size);
> + if (RunOne(Data, Size))
> + ReportNewCoverage({Data, Data + Size});
> }
>
> -void Fuzzer::ExecuteCallback(const Unit &U) {
> +void Fuzzer::ExecuteCallback(const uint8_t *Data, size_t Size) {
> // We copy the contents of Unit into a separate heap buffer
> // so that we reliably find buffer overflows in it.
> - std::unique_ptr<uint8_t[]> Data(new uint8_t[U.size()]);
> - memcpy(Data.get(), U.data(), U.size());
> - AssignTaintLabels(Data.get(), U.size());
> - CurrentUnitData = Data.get();
> - CurrentUnitSize = U.size();
> - int Res = CB(Data.get(), U.size());
> + std::unique_ptr<uint8_t[]> DataCopy(new uint8_t[Size]);
> + memcpy(DataCopy.get(), Data, Size);
> + AssignTaintLabels(DataCopy.get(), Size);
> + CurrentUnitData = DataCopy.get();
> + CurrentUnitSize = Size;
> + int Res = CB(DataCopy.get(), Size);
> (void)Res;
> assert(Res == 0);
> CurrentUnitData = nullptr;
> @@ -411,24 +411,25 @@ void Fuzzer::Merge(const std::vector<std
> void Fuzzer::MutateAndTestOne() {
> MD.StartMutationSequence();
>
> - auto U = ChooseUnitToMutate();
> + auto &U = ChooseUnitToMutate();
> + MutateInPlaceHere.resize(Options.MaxLen);
> + memcpy(MutateInPlaceHere.data(), U.data(), U.size());
> + size_t Size = U.size();
>
> for (int i = 0; i < Options.MutateDepth; i++) {
> - size_t Size = U.size();
> - U.resize(Options.MaxLen);
> size_t NewSize = 0;
> if (LLVMFuzzerCustomMutator)
> - NewSize = LLVMFuzzerCustomMutator(U.data(), Size, U.size(),
> - MD.GetRand().Rand());
> + NewSize = LLVMFuzzerCustomMutator(MutateInPlaceHere.data(), Size,
> + Options.MaxLen,
> MD.GetRand().Rand());
> else
> - NewSize = MD.Mutate(U.data(), Size, U.size());
> + NewSize = MD.Mutate(MutateInPlaceHere.data(), Size, Options.MaxLen);
> assert(NewSize > 0 && "Mutator returned empty unit");
> assert(NewSize <= (size_t)Options.MaxLen &&
> "Mutator return overisized unit");
> - U.resize(NewSize);
> + Size = NewSize;
> if (i == 0)
> StartTraceRecording();
> - RunOneAndUpdateCorpus(U);
> + RunOneAndUpdateCorpus(MutateInPlaceHere.data(), Size);
> StopTraceRecording();
> }
> }
>
> Modified: llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp?rev=260829&r1=260828&r2=260829&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp (original)
> +++ llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp Sat Feb 13 11:56:51 2016
> @@ -176,7 +176,8 @@ size_t MutationDispatcher::Mutate_CrossO
> size_t Idx = Rand(Corpus->size());
> const Unit &Other = (*Corpus)[Idx];
> if (Other.empty()) return 0;
> - Unit U(MaxSize);
> + MutateInPlaceHere.resize(MaxSize);
> + auto &U = MutateInPlaceHere;
> size_t NewSize =
> CrossOver(Data, Size, Other.data(), Other.size(), U.data(),
> U.size());
> assert(NewSize > 0 && "CrossOver returned empty unit");
>
> Modified: llvm/trunk/lib/Fuzzer/FuzzerUtil.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerUtil.cpp?rev=260829&r1=260828&r2=260829&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Fuzzer/FuzzerUtil.cpp (original)
> +++ llvm/trunk/lib/Fuzzer/FuzzerUtil.cpp Sat Feb 13 11:56:51 2016
> @@ -93,9 +93,10 @@ int ExecuteCommand(const std::string &Co
> return system(Command.c_str());
> }
>
> -bool ToASCII(Unit &U) {
> +bool ToASCII(uint8_t *Data, size_t Size) {
> bool Changed = false;
> - for (auto &X : U) {
> + for (size_t i = 0; i < Size; i++) {
> + uint8_t &X = Data[i];
> auto NewX = X;
> NewX &= 127;
> if (!isspace(NewX) && !isprint(NewX))
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160216/f6c2161f/attachment.html>
More information about the llvm-commits
mailing list