[论文解读] A Systematic Impact Study for Fuzzer-Found Compiler Bugs
本文对 Clang/LLVM 中由模糊测试工具发现及用户报告的编译器错误在真实世界中的影响进行了系统性、实证研究。基于 309 个 Debian 软件包并分析超过 1000 万行 C/C++ 代码,研究发现近一半由模糊测试发现的错误会导致生成二进制文件发生误编译,尽管仅出现两次测试套件失败,且多数更改因触发条件罕见及编译器优化保守,对语义影响极小或可忽略。
Despite much recent interest in compiler randomized testing (fuzzing), the practical impact of fuzzer-found compiler bugs on real-world applications has barely been assessed. We present the first quantitative and qualitative study of the tangible impact of miscompilation bugs in a mature compiler. We follow a rigorous methodology where the bug impact over the compiled application is evaluated based on (1) whether the bug appears to trigger during compilation; (2) the extent to which generated assembly code changes syntactically due to triggering of the bug; and (3) how much such changes do cause regression test suite failures and could be used to manually trigger divergences during execution. The study is conducted with respect to the compilation of more than 10 million lines of C/C++ code from 309 Debian packages, using 12% of the historical and now fixed miscompilation bugs found by four state-of-the-art fuzzers in the Clang/LLVM compiler, as well as 18 bugs found by human users compiling real code or by formal verification. The results show that almost half of the fuzzer-found bugs propagate to the generated binaries for some packages, but rarely affect their syntax and cause two failures in total when running their test suites. User-reported and formal verification bugs do not exhibit a higher impact, with less frequently triggered bugs and one test failure. Our manual analysis of a selection of bugs, either fuzzer-found or not, suggests that none can easily trigger a runtime divergence on the packages considered in the analysis, and that in general they affect only corner cases.
研究动机与目标
- 定量与定性评估模糊测试工具在成熟编译器(如 Clang/LLVM)中发现的误编译错误在真实世界中的实际影响。
- 比较模糊测试发现的错误与用户报告及形式化验证错误在真实世界应用程序中的影响。
- 评估由于错误导致的生成汇编代码的语法变化是否实际引起程序执行差异或真实软件包中的测试失败。
- 确定由错误引起的二进制差异的频率及其语义重要性是否与生产环境中实际风险相关。
- 通过评估错误严重性是否与真实代码库中的实际影响相关,为编译器开发优先级提供建议。
提出的方法
- 从四个最先进的编译器模糊测试工具(如 Csmith、Yarpgen)中选取历史修复的误编译错误中的 12%,以及来自用户报告和形式化验证的 18 个非模糊测试发现的错误。
- 使用 Clang/LLVM 编译器,对 309 个 Debian 软件包中的超过 1000 万行 C/C++ 代码,在启用和禁用错误优化的情况下进行编译。
- 通过三项标准衡量影响:(1) 错误是否在编译过程中被触发,(2) 汇编代码语法变化的范围,(3) 变化是否导致测试套件失败或运行时行为差异。
- 对部分汇编代码差异进行人工分析,以评估其语义影响,重点关注在特定运行时条件下是否可能导致执行差异。
- 采用保守推理方法评估影响,假设仅改变程序语义的更改才具有实际意义,并排除性能或安全等非功能性影响。
- 评估修复补丁,以理解其是否禁用了潜在有害的优化,并据此推断观察到的二进制差异更可能为无害或有害。
实验结果
研究问题
- RQ1Clang/LLVM 中由模糊测试发现的误编译错误在多大程度上影响了真实世界 C/C++ 应用程序的编译?
- RQ2与用户报告或形式化验证的错误相比,模糊测试发现的错误在二进制修改和测试套件失败方面的实际影响如何?
- RQ3由于误编译错误导致的生成汇编代码的语法变化是否具有语义重要性,还是通常不影响程序行为?
- RQ4在何种运行时条件下,这些二进制差异会导致真实应用程序中实际的执行差异?
- RQ5修复补丁的特性(如保守地禁用优化)与原始错误实际带来的风险之间有何关联?
主要发现
- 约 46% 的模糊测试发现的误编译错误(占历史修复错误的 12%)导致至少一个 Debian 软件包的生成二进制文件发生语法变化。
- 在所有受影响的软件包中,使用存在错误的编译器进行编译时,仅观察到两次测试套件失败,表明尽管二进制文件广泛被修改,但实际影响仍较低。
- 人工分析显示,大多数由错误引起的汇编代码语法变化在语义上无影响,通常由于编译器优化保守或运行时条件罕见所致。
- 对于 EMI Bug #30935(涉及错误地提升除法操作),修复补丁禁用了对非常量除数的除法提升,降低了风险,但该错误影响仍较低,因其触发频率极低。
- 用户报告和形式化验证的错误触发率更低,且仅导致一次测试失败,表明其真实世界影响并不高于模糊测试发现的错误。
- 尽管二进制文件中存在语法变化,但绝大多数错误并未导致执行差异,因为这些变化要么语义上无害,要么需要极特定的运行时条件才能显现。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。