没有人提出明确的答案,所以我做了一个小实验。基于这个实验,到目前为止,这是我的建议:
推荐。进行模糊测试时,您可以考虑设置环境变量LIBC_FATAL_STDERR_=1 MALLOC_CHECK_=3。此设置在我的实验中没有可测量的性能影响,并且根据我的结果,此设置可能会略微增加您检测到的错误数量。
其他设置都没有在我的实验中产生任何可检测的差异。
选修的。如果需要,您可以使用-fstack-protectoror -fstack-protector-all、 with-O2 -D_FORTIFY_SOURCE=2和/或 mudflap 进行编译;并且您可以使用环境变量运行G_SLICE=debug-blocks。在我的实验中,它们都没有任何可衡量的性能影响。但是,它们都没有对发现的错误集产生任何影响。因此,虽然我的实验没有成本,但也没有任何好处。
实验方法和细节。在每次运行中,我ffmpeg使用zzuf一个种子文件对 5000 次迭代进行模糊测试。每个编译器标志/环境变量设置运行一次。我确保模糊测试会在每次运行中生成完全相同的变体文件集,所以唯一的区别是编译器标志/环境变量。为了衡量性能影响,我测量了完成 fuzzing 的 CPU+系统时间。为了衡量对检测错误能力的影响,我记录了哪些变体文件触发了可检测到的崩溃。
我测量了性能,但没有一个选项对性能有任何可检测的影响(在所有情况下差异均 < 1%,可能是由于随机噪声)。
对于错误检测能力,我MALLOC_CHECK_=3略占优势,但其他标志或设置都没有对错误检测能力产生任何影响:
MALLOC_CHECK_=3确实对哪些变体文件导致崩溃有影响。在没有标志的情况下,5000 次迭代中有 22 次导致崩溃。另外 2 次迭代导致了一条警告消息 ( *** glibc detected ***...),如果您知道要查找它,可以使用它来检测错误,因此如果您足够聪明地 grep 模糊日志以获取该消息,则 5000 次迭代中有 24 次会提供错误的迹象——而如果您不知道 grep 日志以获取该特定警告消息,那么 5000 次迭代中只有 22 次提供了错误的指示。相反,当我启用时MALLOC_CHECK_=3,5000 次迭代中有 25 次导致崩溃,并且不需要 grep 日志。因此,MALLOC_CHECK_=3两者在发现错误迹象方面稍微更有效,并且还减少了专门对模糊日志进行后处理的需要。
有趣的是,有一个变体文件在没有设置的情况下使程序崩溃,但没有使程序崩溃MALLOC_CHECK_=3,这证实了@this.josh 的假设,即在某些情况下额外检查可能会导致我们错过一些错误——但同时,有 2 个变体文件在没有设置的情况下不会使程序崩溃,但确实会导致程序崩溃MALLOC_CHECK_=3。因此,它的好处MALLOC_CHECK_=3超过了它的成本。
除了MALLOC_CHECK_,其他任何设置都不会对哪些变体文件触发可检测到的崩溃产生任何影响。导致基线程序(无特殊标志)崩溃的变体文件集与使用特殊标志编译时导致程序崩溃的变体文件集完全相同。因此,至少在这个实验中,那些其他设置并没有让我们付出任何代价(在性能方面)——但也没有给我们带来任何好处(在错误检测能力方面)。
我的实验远非权威。要做到这一点,人们应该真正尝试使用许多不同的程序(不仅仅是一个)和多个不同的种子文件(不仅仅是一个)。所以我提醒你不要从这个小实验中得出太多结论。但我认为结果仍然很有趣。