aboutsummaryrefslogtreecommitdiff
path: root/compiler-rt/lib/fuzzer/FuzzerDriver.cpp
AgeCommit message (Collapse)AuthorFilesLines
7 days[NFC] [compiler-rt] fix typos (#160803)co63oc1-2/+2
fix typos
2025-09-16Reapply "[NFC] Fix CodeQL violations in compiler-rt. (#157793)" (#157913) ↵Amit Kumar Pandey1-2/+2
(#159097) Fix below buildbot failure. ``` /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/compiler-rt/lib/fuzzer/FuzzerDriver.cpp:172:42: error: use of undeclared identifier 'uint' 172 | Printf("Flag: %s %u\n", Name, (uint)Val); ``` Replace uint with uint32_t cast. This reverts commit 8062b166762b51f1c3a9168e7031babde3e330a8.
2025-09-10Revert "[NFC] Fix CodeQL violations in compiler-rt. (#157793)" (#157913)Amit Kumar Pandey1-2/+2
This reverts commit b44e6e01f7f778bbb569e07821f5ddfdb90c4d4d.
2025-09-10[NFC] Fix CodeQL violations in compiler-rt. (#157793)Amit Kumar Pandey1-2/+2
This pull request addresses fixes against violations happening under subcategory 'cpp/wrong-type-format-argument' related to dfsan,fuzzer,hwasan.
2025-08-26[fuzzer][Fuchsia] Forward fix for undefined StartRssThread (#155514)PiJoules1-2/+2
The declaration was static when it shouldn't be since it can be defined in FuzzerUtilFuchsia.cpp
2025-08-25Reapply "[fuzzer][Fuchsia] Prevent deadlock from suspending threads" … ↵PiJoules1-0/+6
(#155271) …(#155042) This reverts commit 781a4db6b50bb660cb293d3e7e29957aeb4b02ac. Relanded with the fix declaring StartRssThread.
2025-08-22Revert "[fuzzer][Fuchsia] Prevent deadlock from suspending threads" (#155042)gulfemsavrun1-4/+0
Reverts llvm/llvm-project#154854 because it broke Clang toolchain builders for Fuchsia: https://luci-milo.appspot.com/ui/p/fuchsia/builders/toolchain.ci/clang-linux-x64/b8705803649235662417/overview
2025-08-22[fuzzer][Fuchsia] Prevent deadlock from suspending threads (#154854)PiJoules1-0/+4
Every once in a couple hundred runs of a downstream fuzzer test, we see a fuzzing test freeze while waiting for a thread to be suspended. The main thread is frozen because it's waiting to suspend either the alarm or rss thread which is stuck waiting for an exception they sent out to be handled. Specifically, both threads send out a synthetic `ZX_EXCP_THREAD_STARTING` exception to be handled by the crash handling thread which sets up an exception channel on the whole process with `ZX_EXCEPTION_CHANNEL_DEBUGGER`. This is the only channel type that listens to thread stop/start exceptions. Normally, the exception would be ignored and the alarm or rss thread would continue normally once the crash handling thread closes the read exception. However, the memory snapshot machinery can suspend this thread while its in the process of waiting for or handling a `ZX_EXCP_THREAD_STARTING` sent by either the rss or alarm thread. If this is suspended first, then we attempt to suspend either the alarm or rss thread while they're still waiting for the crash handling thread to handle its exception, we will freeze waiting for those threads to give the suspend signal, which they won't because they're blocked on waiting for the exception handler. This is the deadlock. Until there's a way for the memory snapshot machinery to suspend the thread while it's stuck on an exception, then we can work around this in the meantime by just ensuring the alarm and rss threads start normally via signals on the initial startup path. I can assert locally the freezing doesn't occur after 6000 runs where prior we would see it every couple hundred runs. Note this type of issue can arise again if the fuzzing test launches any dangling threads that happen to not start yet. One of the recommendations for writing a fuzz test is that the test may launch threads, but they should be joined by the end of the test (https://llvm.org/docs/LibFuzzer.html#fuzz-target), so hopefully we won't see this type of bug rise frequently from fuzz tests. More broadly, this can also arise if any process launches its own debugger via `ZX_EXCEPTION_CHANNEL_DEBUGGER`, but I would think in practice this isn't very likely to happen. More context in https://fxbug.dev/436923423. --------- Co-authored-by: Petr Hosek <phosek@google.com>
2025-07-28[compiler-rt][libFuzzer] Add support for capturing SIGTRAP exits. (#149120)Dan Blackwell1-0/+1
Swift's FatalError raises a SIGTRAP, which currently causes the fuzzer to exit without writing out the crashing input. rdar://142975522
2025-07-10[compiler-rt] Include missing headers for libFuzzer (#146828)Takuto Ikuta1-1/+2
This is to fix modules build errors in chromium like * https://ci.chromium.org/ui/p/chromium/builders/try/linux-libfuzzer-asan-rel/2292144/overview * https://ci.chromium.org/ui/p/chromium/builders/try/linux-libfuzzer-asan-rel/2292444/overview --------- Co-authored-by: Petr Hosek <phosek@google.com>
2024-05-10[libfuzzer] Prevent MSan false positive when printing log with -jobs (#91679)Thurston Dang1-0/+1
libfuzzer's -jobs option will, depending on the number of CPUs, spin up a WorkerThread and end up printing the log file using CopyFileToErr. This leads to an MSan false positive. This patch disables the MSan interceptor checks, similarly to other instances in https://reviews.llvm.org/D48891 Side-note: this false positive issue first appeared when printf() was replaced by puts() (90b4d1bcb20180c591385131b12fa90d2e4860b1). The interceptor check was always present; however, MSan does not check_printf by default.
2023-07-26[Fuzzer] Assign names to workersDavid CARLIER1-3/+6
Allow to have a name for workers in case the fuzzed code is itself using threads. Reviewers: vitalybuka Reviewed-By: vitalybuka Differential Revision: https://reviews.llvm.org/D155754
2023-04-11[fuzzer] Fix -Wunreachable-code-aggressive warning in FuzzerDriver.cppNico Weber1-1/+0
Differential Revision: https://reviews.llvm.org/D148008
2023-03-07Add test for Flags.data_flow_traceWu, Yingcong1-1/+1
`CollectDataFlow()` uses `Flags.collect_data_flow` and `Flags.data_flow_trace` at the same time. But in the null check before the invocation, only `Flags.collect_data_flow` is checked, and there is no other method to make sure `Flags.data_flow_trace` is not null, so adding a null check for `Flags.data_flow_trace`. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D145040
2023-03-07Use the right printf format specifiersWu, Yingcong1-4/+4
Some printf format strings in libfuzzer are using the wrong specifizers, fix in this commit. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D145033
2021-09-08Redistribute energy for Corpusgtt19951-0/+1
I found that the initial corpus allocation of fork mode has certain defects. I designed a new initial corpus allocation strategy based on size grouping. This method can give more energy to the small seeds in the corpus and increase the throughput of the test. Fuzzbench data (glibfuzzer is -fork_corpus_groups=1): https://www.fuzzbench.com/reports/experimental/2021-08-05-parallel/index.html Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D105084
2021-09-07Greedy set cover implementation of `Merger::Merge`aristotelis1-4/+6
Extend the existing single-pass algorithm for `Merger::Merge` with an algorithm that gives better results. This new implementation can be used with a new **set_cover_merge=1** flag. This greedy set cover implementation gives a substantially smaller final corpus (40%-80% less testcases) while preserving the same features/coverage. At the same time, the execution time penalty is not that significant (+50% for ~1M corpus files and far less for smaller corpora). These results were obtained by comparing several targets with varying size corpora. Change `Merger::CrashResistantMergeInternalStep` to collect all features from each file and not just unique ones. This is needed for the set cover algorithm to work correctly. The implementation of the algorithm in `Merger::SetCoverMerge` uses a bitvector to store features that are covered by a file while performing the pass. Collisions while indexing the bitvector are ignored similarly to the fuzzer. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D105284
2021-08-03[libFuzzer] replace Vector/Set with std::vector/std::set. The custom names ↵Kostya Serebryany1-30/+33
are not required any more since we now build with a private version of libc++. Fix some of the 81+ character lines. Mechanical change, NFC expected. [libFuzzer] replace Vector/Set with std::vector/std::set. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D107374
2021-07-02Revert "Refactor mutation strategies into a standalone library"Marco Vanotti1-5/+3
This reverts commit 361f742f168de0f0f256802a329c19d081615d0d.
2021-07-02Refactor mutation strategies into a standalone libraryAaron Green1-3/+5
This change introduces libMutagen/libclang_rt.mutagen.a as a subset of libFuzzer/libclang_rt.fuzzer.a. This library contains only the fuzzing strategies used by libFuzzer to produce new test inputs from provided inputs, dictionaries, and SanitizerCoverage feedback. Most of this change is simply moving sections of code to one side or the other of the library boundary. The only meaningful new code is: * The Mutagen.h interface and its implementation in Mutagen.cpp. * The following methods in MutagenDispatcher.cpp: * UseCmp * UseMemmem * SetCustomMutator * SetCustomCrossOver * LateInitialize (similar to the MutationDispatcher's original constructor) * Mutate_AddWordFromTORC (uses callbacks instead of accessing TPC directly) * StartMutationSequence * MutationSequence * DictionaryEntrySequence * RecommendDictionary * RecommendDictionaryEntry * FuzzerMutate.cpp (which now justs sets callbacks and handles printing) * MutagenUnittest.cpp (which adds tests of Mutagen.h) A note on performance: This change was tested with a 100 passes of test/fuzzer/LargeTest.cpp with 1000 runs per pass, both with and without the change. The running time distribution was qualitatively similar both with and without the change, and the average difference was within 30 microseconds (2.240 ms/run vs 2.212 ms/run, respectively). Both times were much higher than observed with the fully optimized system clang (~0.38 ms/run), most likely due to the combination of CMake "dev mode" settings (e.g. CMAKE_BUILD_TYPE="Debug", LLVM_ENABLE_LTO=OFF, etc.). The difference between the two versions built similarly seems to be "in the noise" and suggests no meaningful performance degradation. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D102447
2021-05-26Revert "Refactor mutation strategies into a standalone library"Matt Morehouse1-5/+3
This reverts commit c4a41cd77c15c2905ac74beeec09f8343a65a549 due to buildbot failure.
2021-05-26Refactor mutation strategies into a standalone libraryAaron Green1-3/+5
This change introduces libMutagen/libclang_rt.mutagen.a as a subset of libFuzzer/libclang_rt.fuzzer.a. This library contains only the fuzzing strategies used by libFuzzer to produce new test inputs from provided inputs, dictionaries, and SanitizerCoverage feedback. Most of this change is simply moving sections of code to one side or the other of the library boundary. The only meaningful new code is: * The Mutagen.h interface and its implementation in Mutagen.cpp. * The following methods in MutagenDispatcher.cpp: * UseCmp * UseMemmem * SetCustomMutator * SetCustomCrossOver * LateInitialize (similar to the MutationDispatcher's original constructor) * Mutate_AddWordFromTORC (uses callbacks instead of accessing TPC directly) * StartMutationSequence * MutationSequence * DictionaryEntrySequence * RecommendDictionary * RecommendDictionaryEntry * FuzzerMutate.cpp (which now justs sets callbacks and handles printing) * MutagenUnittest.cpp (which adds tests of Mutagen.h) A note on performance: This change was tested with a 100 passes of test/fuzzer/LargeTest.cpp with 1000 runs per pass, both with and without the change. The running time distribution was qualitatively similar both with and without the change, and the average difference was within 30 microseconds (2.240 ms/run vs 2.212 ms/run, respectively). Both times were much higher than observed with the fully optimized system clang (~0.38 ms/run), most likely due to the combination of CMake "dev mode" settings (e.g. CMAKE_BUILD_TYPE="Debug", LLVM_ENABLE_LTO=OFF, etc.). The difference between the two versions built similarly seems to be "in the noise" and suggests no meaningful performance degradation. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D102447
2021-03-11[crt][fuzzer] Fix up various numeric conversionsAaron Green1-6/+6
Attempting to build a standalone libFuzzer in Fuchsia's default toolchain for the purpose of cross-compiling the unit tests revealed a number of not-quite-proper type conversions. Fuchsia's toolchain include `-std=c++17` and `-Werror`, among others, leading to many errors like `-Wshorten-64-to-32`, `-Wimplicit-float-conversion`, etc. Most of these have been addressed by simply making the conversion explicit with a `static_cast`. These typically fell into one of two categories: 1) conversions between types where high precision isn't critical, e.g. the "energy" calculations for `InputInfo`, and 2) conversions where the values will never reach the bits being truncated, e.g. `DftTimeInSeconds` is not going to exceed 136 years. The major exception to this is the number of features: there are several places that treat features as `size_t`, and others as `uint32_t`. This change makes the decision to cap the features at 32 bits. The maximum value of a feature as produced by `TracePC::CollectFeatures` is roughly: (NumPCsInPCTables + ValueBitMap::kMapSizeInBits + ExtraCountersBegin() - ExtraCountersEnd() + log2(SIZE_MAX)) * 8 It's conceivable for extremely large targets and/or extra counters that this limit could be reached. This shouldn't break fuzzing, but it will cause certain features to collide and lower the fuzzers overall precision. To address this, this change adds a warning to TracePC::PrintModuleInfo about excessive feature size if it is detected, and recommends refactoring the fuzzer into several smaller ones. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D97992
2020-11-12[fuzzer] Add Windows Visual C++ exception interceptJoe Pletcher1-0/+2
Adds a new option, `handle_winexcept` to try to intercept uncaught Visual C++ exceptions on Windows. On Linux, such exceptions are handled implicitly by `std::terminate()` raising `SIBABRT`. This option brings the Windows behavior in line with Linux. Unfortunately this exception code is intentionally undocumented, however has remained stable for the last decade. More information can be found here: https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 Reviewed By: morehouse, metzman Differential Revision: https://reviews.llvm.org/D89755
2020-10-23[libFuzzer] Added -print_full_coverage flag.Max Moroz1-1/+7
-print_full_coverage=1 produces a detailed branch coverage dump when run on a single file. Uses same infrastructure as -print_coverage flag, but prints all branches (regardless of coverage status) in an easy-to-parse format. Usage: For internal use with machine learning fuzzing models which require detailed coverage information on seed files to generate mutations. Differential Revision: https://reviews.llvm.org/D85928
2020-09-16[libFuzzer] Enable entropic by default.Matt Morehouse1-7/+3
Entropic has performed at least on par with vanilla scheduling on Clusterfuzz, and has shown a slight coverage improvement on FuzzBench: https://www.fuzzbench.com/reports/2020-08-31/index.html Reviewed By: Dor1s Differential Revision: https://reviews.llvm.org/D87476
2020-09-09[libFuzzer] Add a command-line option for tracing mutation of corpus inputs ↵Dokyung Song1-0/+2
in the dot graph format. This patch adds a new command-line option -mutation_graph_file=FILE for debugging purposes, which traces how corpus inputs evolve during a fuzzing run. For each new input that is added to the corpus, a new vertex corresponding to the added input, as well as a new edge that connects its base input to itself are written to the given file. Each vertex is labeled with the filename of the input, and each edge is labeled with the mutation sequence that led to the input w.r.t. its base input. The format of the mutation graph file is the dot file format. Once prepended and appended with "graph {" and "}", respectively, the graph becomes a valid dot file and can be visualized. Differential Revision: https://reviews.llvm.org/D86560
2020-09-03[libFuzzer] Scale energy assigned to each input based on input execution time.Dokyung Song1-0/+2
This patch scales the energy computed by the Entropic schedule based on the execution time of each input. The input execution time is compared with the average execution time of inputs in the corpus, and, based on the amount by which they differ, the energy is scaled from 0.1x (for inputs executing slow) to 3x (for inputs executing fast). Note that the exact scaling criteria and formula is borrowed from AFL. On FuzzBench, this gives a sizeable throughput increase, which in turn leads to more coverage on several benchmarks. For details, see the following report. https://storage.googleapis.com/fuzzer-test-suite-public/exectime-report/index.html Differential Revision: https://reviews.llvm.org/D86092
2020-09-03[libFuzzer] Evenly select inputs to cross over with from the corpus ↵Dokyung Song1-0/+1
regardless of the input's coverage. This patch adds an option "cross_over_uniform_dist", which, if 1, considers all inputs in the corpus for the crossover input selection. More specifically, this patch uses a uniform distribution of all inputs in the corpus for the CrossOver input selection. Note that input selection for mutation is still fully determined by the scheduling policy (i.e., vanilla or Entropic); the uniform distribution only applies to the secondary input selection, only for the crossover mutation of the base input chosen by the scheduling policy. This way the corpus inputs that have useful fragments in them, even though they are deprioritized by the scheduling policy, have chances of getting mixed with other inputs that are prioritized and selected as base input for mutation. Differential Revision: https://reviews.llvm.org/D86954
2020-09-03[libFuzzer] Add an option to keep initial seed inputs around.Dokyung Song1-0/+1
This patch adds an option "keep_seed" to keep all initial seed inputs in the corpus. Previously, only the initial seed inputs that find new coverage were added to the corpus, and all the other initial inputs were discarded. We observed in some circumstances that useful initial seed inputs are discarded as they find no new coverage, even though they contain useful fragments in them (e.g., SQLITE3 FuzzBench benchmark). This newly added option provides a way to keeping seed inputs in the corpus for those circumstances. With this patch, and with -keep_seed=1, all initial seed inputs are kept in the corpus regardless of whether they find new coverage or not. Further, these seed inputs are not replaced with smaller inputs even if -reduce_inputs=1. Differential Revision: https://reviews.llvm.org/D86577
2020-09-03[fuzzer] Create user provided fuzzer writeable directories when requested if ↵Matt Morehouse1-7/+23
they dont exist Currently, libFuzzer will exit with an error message if a non-existent directory is provided for any of the appropriate arguments. For cases where libFuzzer is used in a specialized embedded environment, it would be much easier to have libFuzzer create the directories for the user. This patch accommodates for this scenario by allowing the user to provide the argument `-create_missing_dirs=1` which makes libFuzzer attempt to create the `artifact_prefix`, `exact_artifact_path`, `features_dir` and/or corpus directory if they don't already exist rather than throw an error and exit. Split off from D84808 as requested [here](https://reviews.llvm.org/D84808#2208546). Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D86733
2020-09-01Revert "[fuzzer] Create user provided fuzzer writeable directories when ↵Matt Morehouse1-23/+7
requested if they dont exist" This reverts commit cb8912799d4372a3a1c0bf528bb4c4885caf4c45, since the test fails on Windows.
2020-09-01[fuzzer] Create user provided fuzzer writeable directories when requested if ↵Matt Morehouse1-7/+23
they dont exist Currently, libFuzzer will exit with an error message if a non-existent directory is provided for any of the appropriate arguments. For cases where libFuzzer is used in a specialized embedded environment, it would be much easier to have libFuzzer create the directories for the user. This patch accommodates for this scenario by allowing the user to provide the argument `-create_missing_dirs=1` which makes libFuzzer attempt to create the `artifact_prefix`, `exact_artifact_path`, `features_dir` and/or corpus directory if they don't already exist rather than throw an error and exit. Split off from D84808 as requested [here](https://reviews.llvm.org/D84808#2208546). Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D86733
2020-08-26[libFuzzer] Error and exit if user supplied fuzzer writeable directories ↵Matt Morehouse1-5/+33
don't exist Currently, libFuzzer will exit with an error message if a non-existent corpus directory is provided. However, if a user provides a non-existent directory for the `artifact_prefix`, `exact_artifact_path`, or `features_dir`, libFuzzer will continue execution but silently fail to write artifacts/features. To improve the user experience, this PR adds validation for the existence of all user supplied directories before executing the main fuzzing loop. If they don't exist, libFuzzer will exit with an error message. Patch By: dgg5503 Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D84808
2020-08-11[libFuzzer] Fix minimizing timeoutsIlya Leoshkevich1-0/+1
When one tries to minimize timeouts using -minimize_crash=1, minimization immediately fails. The following sequence of events is responsible for this: [parent] SIGALRM occurs [parent] read() returns -EINTR (or -ERESTARTSYS according to strace) [parent] fgets() returns NULL [parent] ExecuteCommand() closes child's stdout and returns [child ] SIGALRM occurs [child ] AlarmCallback() attempts to write "ALARM: ..." to stdout [child ] Dies with SIGPIPE without calling DumpCurrentUnit() [parent] Does not see -exact_artifact_path and exits When minimizing, the timer in parent is not necessary, so fix by not setting it in this case. Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D85359
2020-07-27Replace fuzzer::FuzzerDriver's INTERFACE marking with new LLVMRunFuzzerDriver.Matt Morehouse1-0/+6
This adds a new extern "C" function that serves the same purpose. This removes the need for external users to depend on internal headers in order to use this feature. It also standardizes the interface in a way that other fuzzing engines will be able to match. Patch By: IanPudney Reviewed By: kcc Differential Revision: https://reviews.llvm.org/D84561
2020-07-17Corrected __libfuzzer_is_present symbol inclusion for MSVC x86 32-bitVitaly Buka1-0/+4
The incorrect symbol will cause linking failures for 32-bit targets: clang_rt.fuzzer-i386.lib(FuzzerDriver.obj) : error LNK2001: unresolved external symbol __libfuzzer_is_present Verified no longer fails to link with this change for 32-bit and still succeeds for 64-bit MSVC. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D83594
2020-07-14[libFuzzer] Separate platform related macros out from FuzzerDefs.h into ↵Dokyung Song1-0/+1
FuzzerPlatform.h, and adjust includes in other files. Summary: This patch separates platform related macros in lib/fuzzer/FuzzerDefs.h into lib/fuzzer/FuzzerPlatform.h, and use FuzzerPlatform.h where necessary. This separation helps when compiling libFuzzer's interceptor module (under review); an unnecessary include of standard headers (such as string.h) may produce conflicts/ambiguation with the interceptor's declarations/definitions of library functions, which complicates interceptor implementation. Reviewers: morehouse, hctim Reviewed By: morehouse Subscribers: krytarowski, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D83805
2020-05-19Entropic: Boosting LibFuzzer PerformanceMatt Morehouse1-1/+21
Summary: This is collaboration between Marcel Boehme @ Monash, Australia and Valentin Manès plus Sang Kil Cha @ KAIST, South Korea. We have made a few modifications to boost LibFuzzer performance by changing how weights are assigned to the seeds in the corpus. Essentially, seeds that reveal more "information" about globally rare features are assigned a higher weight. Our results on the Fuzzer Test Suite seem quite promising. In terms of bug finding, our Entropic patch usually finds the same errors much faster and in more runs. In terms of coverage, our version Entropic achieves the same coverage in less than half the time for the majority of subjects. For the lack of space, we shared more detailed performance results directly with @kcc. We'll publish the preprint with all the technical details as soon as it is accepted. Happy to share if you drop us an email. There should be plenty of opportunities to optimise further. For instance, while Entropic achieves the same coverage in less than half the time, Entropic has a much lower #execs per second. We ran the perf-tool and found a few performance bottlenecks. Thanks for open-sourcing LibFuzzer (and the entire LLVM Compiler Infrastructure)! This has been such a tremendous help to my research. Patch By: Marcel Boehme Reviewers: kcc, metzman, morehouse, Dor1s, vitalybuka Reviewed By: kcc Subscribers: dgg5503, Valentin, llvm-commits, kcc Tags: #llvm Differential Revision: https://reviews.llvm.org/D73776
2020-02-12[Fuzzer] Rename ExecuteCommandWithPopen to ExecuteCommandNon-Fushsia target ↵Yuanfang Chen1-16/+2
will keep using popen/pclose implementation. OnFuchsia, Two-args version of `ExecuteCommand` is a simple wrapper of theone-arg version. (Hopefully) Fix D73329 build on Fuchsia.
2020-02-10Reland "[NFC][libFuzzer] Prefix TempPath with string showing the work it is ↵Yuanfang Chen1-2/+2
doing." With fix (somehow one hunk is missed).
2020-02-10Revert "[NFC][libFuzzer] Prefix TempPath with string showing the work it is ↵Yuanfang Chen1-2/+2
doing." This reverts commit 8a29cb4421f1196bc40c4db5298ca13df516bf19. fuzzer-linux bot has failure because of this.
2020-02-10[NFC][libFuzzer] Prefix TempPath with string showing the work it is doing.Yuanfang Chen1-2/+2
2020-02-10[libFuzzer] communicate through pipe to subprocess for MinimizeCrashInputYuanfang Chen1-19/+27
For CleanseCrashInput, discards stdout output anyway since it is not used. These changes are to defend against aggressive PID recycle on windows to reduce the chance of contention on files. Using pipe instead of file also workaround the problem that when the process is spawned by llvm-lit, the aborted process keeps a handle to the output file such that the output file can not be removed. This will cause random test failures. https://devblogs.microsoft.com/oldnewthing/20110107-00/?p=11803 Reviewers: kcc, vitalybuka Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D73329
2020-01-22[libFuzzer] Add INFO output when LLVMFuzzerCustomMutator is found.Max Moroz1-1/+4
Summary: there is an ongoing work on interchangeable custom mutators (https://github.com/google/clusterfuzz/pull/1333/files#r367706283) and having some sort of signalling from libFuzzer that it has loaded a custom mutator would be helpful. The initial idea was to make the mutator to print something, but given the anticipated variety of different mutators, it does not seem possible to make all of them print the same message to signal their execution. Reviewers: kcc, metzman Reviewed By: metzman Subscribers: #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D73136
2019-12-12[fuzzer] Add basic support for emscripten.Jonathan Metzman1-1/+6
Summary: Add basic support for emscripten. This enables libFuzzer to build (using build.sh) for emscripten and fuzz a target compiled with -fsanitize-coverage=inline-8bit-counters. Basic fuzzing and bug finding work with this commit. RSS limit and timeouts will not work because they depend on system functions that are not implemented/widely supported in emscripten. Reviewers: kcc, vitalybuka, hctim Reviewed By: hctim Subscribers: #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D71285
2019-10-01[libFuzzer] Remove lazy counters.Matt Morehouse1-1/+0
Summary: Lazy counters haven't improved performance for large fuzz targets. Reviewers: kcc Reviewed By: kcc Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67476 llvm-svn: 373403
2019-06-14[libFuzzer] implement a better queue for the fork mode. Add an internal flag ↵Kostya Serebryany1-0/+2
-stop_file to allow graceful shutdown of fuzzing. Enhance the logging in the fork mode llvm-svn: 363470
2019-06-14[libFuzzer] Disable len_control by default if LLVMFuzzerCustomMutator is used.Max Moroz1-2/+8
Summary: Some custom mutators may not peform well when size restriction is enforced by len_control. Because of that, it's safer to disable len_control by default in such cases, but still allow users to enable it manually. Bug example: https://bugs.chromium.org/p/chromium/issues/detail?id=919530. Tested manually with LPM-based and regular fuzz targets. Reviewers: kcc, vitalybuka, metzman Reviewed By: kcc, metzman Subscribers: delcypher, #sanitizers, llvm-commits Tags: #llvm, #sanitizers Differential Revision: https://reviews.llvm.org/D63334 llvm-svn: 363443
2019-05-23[libFuzzer] automatically collect the data flow trace (DFT) in the fork mode ↵Kostya Serebryany1-1/+3
if -collect_data_flow= is given llvm-svn: 361448