diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2017-08-27 23:20:09 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2017-08-27 23:20:09 +0000 |
commit | bebcbfb46dc7c89d32eb11254123211f87087dca (patch) | |
tree | ac7ca788e2445caf8b5ff0a60eab3f220a126975 /compiler-rt/lib/fuzzer/FuzzerDriver.cpp | |
parent | 41395022a32a29d8bab5af989a59af4cb83b1191 (diff) | |
download | bcm5719-llvm-bebcbfb46dc7c89d32eb11254123211f87087dca.tar.gz bcm5719-llvm-bebcbfb46dc7c89d32eb11254123211f87087dca.zip |
[libFuzzer] Use custom allocators for STL containers in libFuzzer.
Avoids ODR violations causing spurious ASAN warnings.
Differential Revision: https://reviews.llvm.org/D37086
llvm-svn: 311866
Diffstat (limited to 'compiler-rt/lib/fuzzer/FuzzerDriver.cpp')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerDriver.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerDriver.cpp b/compiler-rt/lib/fuzzer/FuzzerDriver.cpp index d0d0f7dd005..1ed70923773 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 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 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 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 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 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; + 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 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 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 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 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()); + Vector<int> Scores(Dict.size()); + Vector<int> Usages(Dict.size()); - std::vector<size_t> InitialFeatures; - std::vector<size_t> ModifiedFeatures; + Vector<size_t> InitialFeatures; + Vector<size_t> ModifiedFeatures; for (auto &C : Corpus) { // Get coverage for the testcase without modifications. F->ExecuteCallback(C.data(), C.size()); @@ -477,7 +477,7 @@ int AnalyzeDictionary(Fuzzer *F, const std::vector<Unit>& Dict, }); for (size_t i = 0; i < Dict.size(); ++i) { - auto Data = C; + Vector<uint8_t> Data = C; auto StartPos = std::search(Data.begin(), Data.end(), Dict[i].begin(), Dict[i].end()); // Skip dictionary unit, if the testcase does not contain it. @@ -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 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; + Vector<Unit> Dictionary; if (Flags.dict) if (!ParseDictionaryFile(FileToString(Flags.dict), &Dictionary)) return 1; |