diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2017-08-26 17:17:37 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2017-08-26 17:17:37 +0000 |
commit | d50410bfb1d1fe12e58ea777186501ab7ce1d2a0 (patch) | |
tree | 9bb6e3d7cea24b47c6f68a31555906718ab832a6 /compiler-rt/lib/fuzzer/FuzzerDriver.cpp | |
parent | de269f4620ea1a14f5537d361b41b15fb65a9110 (diff) | |
download | bcm5719-llvm-d50410bfb1d1fe12e58ea777186501ab7ce1d2a0.tar.gz bcm5719-llvm-d50410bfb1d1fe12e58ea777186501ab7ce1d2a0.zip |
[libFuzzer] Use custom allocators for STL containers in libFuzzer
Avoids ODR violations causing spurious ASAN container overflow warnings.
Differential Revision: https://reviews.llvm.org/D37086
llvm-svn: 311830
Diffstat (limited to 'compiler-rt/lib/fuzzer/FuzzerDriver.cpp')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerDriver.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerDriver.cpp b/compiler-rt/lib/fuzzer/FuzzerDriver.cpp index d0d0f7dd005..1bae8702e31 100644 --- a/compiler-rt/lib/fuzzer/FuzzerDriver.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerDriver.cpp @@ -74,7 +74,7 @@ static const FlagDescription FlagDescriptions [] { static const size_t kNumFlags = sizeof(FlagDescriptions) / sizeof(FlagDescriptions[0]); -static std::vector<std::string> *Inputs; +static fuzzer::vector<std::string> *Inputs; static std::string *ProgName; static void PrintHelp() { @@ -175,7 +175,7 @@ static bool ParseOneFlag(const char *Param) { } // We don't use any library to minimize dependencies. -static void ParseFlags(const std::vector<std::string> &Args) { +static void ParseFlags(const fuzzer::vector<std::string> &Args) { for (size_t F = 0; F < kNumFlags; F++) { if (FlagDescriptions[F].IntFlag) *FlagDescriptions[F].IntFlag = FlagDescriptions[F].Default; @@ -185,7 +185,7 @@ static void ParseFlags(const std::vector<std::string> &Args) { if (FlagDescriptions[F].StrFlag) *FlagDescriptions[F].StrFlag = nullptr; } - Inputs = new std::vector<std::string>; + Inputs = new fuzzer::vector<std::string>; for (size_t A = 1; A < Args.size(); A++) { if (ParseOneFlag(Args[A].c_str())) { if (Flags.ignore_remaining_args) @@ -225,7 +225,7 @@ static void WorkerThread(const std::string &Cmd, std::atomic<unsigned> *Counter, } } -std::string CloneArgsWithoutX(const std::vector<std::string> &Args, +std::string CloneArgsWithoutX(const fuzzer::vector<std::string> &Args, const char *X1, const char *X2) { std::string Cmd; for (auto &S : Args) { @@ -236,12 +236,12 @@ std::string CloneArgsWithoutX(const std::vector<std::string> &Args, return Cmd; } -static int RunInMultipleProcesses(const std::vector<std::string> &Args, +static int RunInMultipleProcesses(const fuzzer::vector<std::string> &Args, unsigned NumWorkers, unsigned NumJobs) { std::atomic<unsigned> Counter(0); std::atomic<bool> HasErrors(false); std::string Cmd = CloneArgsWithoutX(Args, "jobs", "workers"); - std::vector<std::thread> V; + fuzzer::vector<std::thread> V; std::thread Pulse(PulseThread); Pulse.detach(); for (unsigned i = 0; i < NumWorkers; i++) @@ -294,7 +294,7 @@ static std::string GetDedupTokenFromFile(const std::string &Path) { return S.substr(Beg, End - Beg); } -int CleanseCrashInput(const std::vector<std::string> &Args, +int CleanseCrashInput(const fuzzer::vector<std::string> &Args, const FuzzingOptions &Options) { if (Inputs->size() != 1 || !Flags.exact_artifact_path) { Printf("ERROR: -cleanse_crash should be given one input file and" @@ -322,7 +322,7 @@ int CleanseCrashInput(const std::vector<std::string> &Args, auto U = FileToVector(CurrentFilePath); size_t Size = U.size(); - const std::vector<uint8_t> ReplacementBytes = {' ', 0xff}; + const fuzzer::vector<uint8_t> ReplacementBytes = {' ', 0xff}; for (int NumAttempts = 0; NumAttempts < 5; NumAttempts++) { bool Changed = false; for (size_t Idx = 0; Idx < Size; Idx++) { @@ -354,7 +354,7 @@ int CleanseCrashInput(const std::vector<std::string> &Args, return 0; } -int MinimizeCrashInput(const std::vector<std::string> &Args, +int MinimizeCrashInput(const fuzzer::vector<std::string> &Args, const FuzzingOptions &Options) { if (Inputs->size() != 1) { Printf("ERROR: -minimize_crash should be given one input file\n"); @@ -456,17 +456,17 @@ int MinimizeCrashInputInternalStep(Fuzzer *F, InputCorpus *Corpus) { return 0; } -int AnalyzeDictionary(Fuzzer *F, const std::vector<Unit>& Dict, +int AnalyzeDictionary(Fuzzer *F, const fuzzer::vector<Unit>& Dict, UnitVector& Corpus) { Printf("Started dictionary minimization (up to %d tests)\n", Dict.size() * Corpus.size() * 2); // Scores and usage count for each dictionary unit. - std::vector<int> Scores(Dict.size()); - std::vector<int> Usages(Dict.size()); + fuzzer::vector<int> Scores(Dict.size()); + fuzzer::vector<int> Usages(Dict.size()); - std::vector<size_t> InitialFeatures; - std::vector<size_t> ModifiedFeatures; + fuzzer::vector<size_t> InitialFeatures; + fuzzer::vector<size_t> ModifiedFeatures; for (auto &C : Corpus) { // Get coverage for the testcase without modifications. F->ExecuteCallback(C.data(), C.size()); @@ -531,7 +531,7 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { EF = new ExternalFunctions(); if (EF->LLVMFuzzerInitialize) EF->LLVMFuzzerInitialize(argc, argv); - const std::vector<std::string> Args(*argv, *argv + *argc); + const fuzzer::vector<std::string> Args(*argv, *argv + *argc); assert(!Args.empty()); ProgName = new std::string(Args[0]); if (Argv0 != *ProgName) { @@ -593,7 +593,7 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { Options.ArtifactPrefix = Flags.artifact_prefix; if (Flags.exact_artifact_path) Options.ExactArtifactPath = Flags.exact_artifact_path; - std::vector<Unit> Dictionary; + fuzzer::vector<Unit> Dictionary; if (Flags.dict) if (!ParseDictionaryFile(FileToString(Flags.dict), &Dictionary)) return 1; |