llvm-project/compiler-rt/lib/fuzzer
Matt Morehouse e2e38fca64 Entropic: Boosting LibFuzzer Performance
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-05-19 10:28:57 -07:00
..
afl [compiler-rt] [fuzzer] Include stdarg.h for va_list 2019-12-19 01:11:39 +01:00
dataflow [libFuzzer] split DataFlow.cpp into two .cpp files, one of which can be compiled w/o dfsan to speed things up (~25% speedup) 2019-06-21 01:39:35 +00:00
scripts [libFuzzer] remove the data-flow-trace (DFT) python scripts; their functionality is now part of libFuzzer proper; also write functions.txt to the disk only if this file doesn't exist yet 2019-05-23 01:03:42 +00:00
standalone [libFuzzer] fix missing close on opened file 2019-02-26 19:33:00 +00:00
tests Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
CMakeLists.txt [CMake] Refactor iOS simulator/device test configuration generation code for LibFuzzer. 2020-01-23 12:44:00 -08:00
FuzzerBuiltins.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerBuiltinsMsvc.h LibFuzzer support for 32bit MSVC 2019-08-22 20:44:34 +00:00
FuzzerCommand.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerCorpus.h Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
FuzzerCrossOver.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerDataFlowTrace.cpp [libFuzzer] Make dataflow and focus functions more user friendly. 2020-02-03 08:36:03 -08:00
FuzzerDataFlowTrace.h [libFuzzer] in autofocus mode, give more weight to functions with DFT 2019-06-14 23:29:56 +00:00
FuzzerDefs.h [fuzzer] Add basic support for emscripten. 2019-12-12 08:56:47 -08:00
FuzzerDictionary.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerDriver.cpp Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
FuzzerExtFunctions.def [libFuzzer] Always print DSO map on Fuchsia libFuzzer launch 2019-09-17 00:34:41 +00:00
FuzzerExtFunctions.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerExtFunctionsDlsym.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerExtFunctionsWeak.cpp [fuzzer] Add basic support for emscripten. 2019-12-12 08:56:47 -08:00
FuzzerExtFunctionsWindows.cpp [libFuzzer] Remove extra semicolons 2019-02-26 17:46:13 +00:00
FuzzerExtraCounters.cpp [fuzzer] Add basic support for emscripten. 2019-12-12 08:56:47 -08:00
FuzzerFlags.def Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
FuzzerFork.cpp Reland "[NFC][libFuzzer] Prefix TempPath with string showing the work it is doing." 2020-02-10 18:23:39 -08:00
FuzzerFork.h [libFuzzer] add threads to the fork mode: now you can pass -fork=N to run N concurrent workers. Fork mode is still work-in-progress. 2019-02-14 00:25:43 +00:00
FuzzerIO.cpp Reland "[NFC][libFuzzer] Prefix TempPath with string showing the work it is doing." 2020-02-10 18:23:39 -08:00
FuzzerIO.h Reland "[NFC][libFuzzer] Prefix TempPath with string showing the work it is doing." 2020-02-10 18:23:39 -08:00
FuzzerIOPosix.cpp [libFuzzer] don't use /dev/null for DiscardOuput in Fuchsia. 2019-11-21 16:56:05 -08:00
FuzzerIOWindows.cpp [libFuzzer] don't use /dev/null for DiscardOuput in Fuchsia. 2019-11-21 16:56:05 -08:00
FuzzerInterface.h [libFuzzer][Windows] Use dllexport for all declarations in FuzzerInterface.h 2019-01-28 17:51:13 +00:00
FuzzerInternal.h [libFuzzer] Merge: print feature coverage number as well. 2019-08-12 20:21:27 +00:00
FuzzerLoop.cpp Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
FuzzerMain.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerMerge.cpp [libFuzzer] Make -merge=1 to reuse coverage information from the control file. 2019-09-11 14:11:08 +00:00
FuzzerMerge.h [libFuzzer] fix the unit tests 2019-02-15 00:15:13 +00:00
FuzzerMutate.cpp [libFuzzer] Make MutateWithMask work when the Mask is shorter than the input. 2019-04-11 18:21:53 +00:00
FuzzerMutate.h [libFuzzer] refactor the way we choose the element to cross-over with, NFC (expected1); add a flag -seed_inputs= to pass extra seed inputs as file paths, not dirs 2019-02-08 01:20:54 +00:00
FuzzerOptions.h Entropic: Boosting LibFuzzer Performance 2020-05-19 10:28:57 -07:00
FuzzerRandom.h [libFuzzer] replace slow std::mt19937 with a much faster std::minstd_rand; second attempt after failed r352732, this time with a fix for cmake 2019-02-12 01:00:08 +00:00
FuzzerSHA1.cpp [libFuzzer][MSVC] Enable building libFuzzer with MSVC 2019-01-22 18:59:25 +00:00
FuzzerSHA1.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
FuzzerTracePC.cpp [libFuzzer] Make dataflow and focus functions more user friendly. 2020-02-03 08:36:03 -08:00
FuzzerTracePC.h [libFuzzer] Remove lazy counters. 2019-10-01 22:49:06 +00:00
FuzzerUtil.cpp Fix UB in compiler-rt base64 implementation 2020-03-03 13:28:32 +01:00
FuzzerUtil.h [Fuzzer] Rename ExecuteCommandWithPopen to ExecuteCommandNon-Fushsia target 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-12 16:03:55 -08:00
FuzzerUtilDarwin.cpp [libFuzzer] don't use /dev/null for DiscardOuput in Fuchsia. 2019-11-21 16:56:05 -08:00
FuzzerUtilFuchsia.cpp [Fuzzer] Rename ExecuteCommandWithPopen to ExecuteCommandNon-Fushsia target 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-12 16:03:55 -08:00
FuzzerUtilLinux.cpp [fuzzer] Add basic support for emscripten. 2019-12-12 08:56:47 -08:00
FuzzerUtilPosix.cpp [Fuzzer] Rename ExecuteCommandWithPopen to ExecuteCommandNon-Fushsia target 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-12 16:03:55 -08:00
FuzzerUtilWindows.cpp [Fuzzer] Rename ExecuteCommandWithPopen to ExecuteCommandNon-Fushsia target 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-12 16:03:55 -08:00
FuzzerValueBitMap.h [libFuzzer][MSVC] Enable building libFuzzer with MSVC 2019-01-22 18:59:25 +00:00
README.txt [libFuzzer] better README.txt 2017-08-22 01:15:40 +00:00
build.sh Switch from Bourne shell to simply base shell to build libfuzzer 2018-01-12 23:45:24 +00:00

README.txt

See http://llvm.org/docs/LibFuzzer.html