No one suggested a definitive answer, so I ran a tiny experiment. Based up on this experiment, here is my recommendation so far:
Recommendation. When fuzzing, you might consider setting the environment variables LIBC_FATAL_STDERR_=1 MALLOC_CHECK_=3
. This setting had no measurable performance impact in my experiment, and based upon my results, this setting might slightly increase the number of bugs you detect.
None of the other settings made any detectable difference in my experiment.
Optional. If you want, you can compile with -fstack-protector
or -fstack-protector-all
, with -O2 -D_FORTIFY_SOURCE=2
, and/or with mudflap; and you can run with the environment variable G_SLICE=debug-blocks
. None of them had any measurable performance impact in my experiment. However, none of them had any impact on the set of bugs found. So while there was no cost in my experiment, there was also no benefit.
Experimental methodology and details. In each run, I fuzzed ffmpeg
with zzuf
, using one seed file, for 5000 iterations. There was one run per setting of compiler flags/environment variables. I ensured that fuzzing would generate exactly the same set of variant-files in each run, so the only difference was the compiler flags/environment variables. To measure the performance impact, I measured the CPU+system time to complete fuzzing. To measure the impact on ability to detect bugs, I recorded which variant-files triggered a detectable crash.
I measured performance, but none of the options had any detectable effect on performance (the differences were < 1% in all cases, and probably due to random noise).
For bug detection power, I MALLOC_CHECK_=3
gave a slight advantage, but none of the other flags or settings made any difference in bug detection power:
MALLOC_CHECK_=3
did have an influence on which variant-files caused a crash. With no flags, 22 of the 5000 iterations caused a crash. Another 2 iterations caused a warning message (*** glibc detected ***
...) that, if you knew to look for it, could be used to detect a bug, so if you were smart enough to grep your fuzzing logs for that message, 24 of the 5000 iterations would provide signs of a bug -- whereas if you don't know to grep the logs for that particular warning message, then only 22 of the 5000 iterations provided indications of a bug. In contrast, when I enabled MALLOC_CHECK_=3
, 25 of the 5000 iterations caused a crash, and there was no need to grep the logs. Thus, MALLOC_CHECK_=3
both is slightly more effective at uncovering signs of a bug, and also reduces the need to postprocess your fuzzing logs specially.
Interestingly, there was one variant-file that crashed the program with no settings but did not crash the program with MALLOC_CHECK_=3
, confirming @this.josh's hypothesis that additional checking in some cases might cause us to miss some bugs -- but at the same time, there were 2 variant-files that didn't crash the program with no settings, but that did crash the program with MALLOC_CHECK_=3
. Thus, the benefits of MALLOC_CHECK_=3
outweighed its costs.
Apart from MALLOC_CHECK_
, none of the other settings had any influence whatsoever on which variant-files triggered a detectable crash. The set of variant-files that caused the baseline program (no special flags) to crash was exactly as the set of variant-files that caused the program to crash when compiled with special flags. Therefore, at least in this experiment, those other settings didn't cost us anything (in performance) -- but also didn't gain us anything (in bug detection power).
My experiment is far from authoritative. To do this right, one should really try it out with many different programs (not just one), and multiple different seed files (not just one). So I'd caution you against drawing too many conclusions from this one small experiment. But I thought the results were interesting nonetheless.