← 最新论文
💻 computer science

Does Programming Language Matter? An Empirical Study of Fuzzing Bug Detection

这项实证研究分析了来自 559 个 OSS-Fuzz 项目的 61,000 多个模糊测试漏洞,旨在证明编程语言显著影响着模糊测试的有效性、漏洞特征以及检测效率,从而强调了开发语言感知型模糊测试策略的必要性。

原作者: Tatsuya Shirai, Olivier Nourry, Yutaro Kashiwa, Kenji Fujiwara, Hajimu Iida

发布于 2026-02-06
📖 1 分钟阅读☕ 轻松阅读

原作者: Tatsuya Shirai, Olivier Nourry, Yutaro Kashiwa, Kenji Fujiwara, Hajimu Iida

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象一下,你是一名大型工厂的质量控制检查员,这家工厂制造各种各样的车辆。有些车辆由原始、灵活的钢材(C/C++)制成,有些是由具有自我修复能力的智能材料(Rust)构建,有些是按照严格的预设规则(Java)组装的,还有一些则是用快速、易适应的胶水(Python)构建的。

多年来,检查员们一直使用一种被称为“模糊测试”(Fuzzing)的特定方法来寻找缺陷。模糊测试就像是向这些车辆投掷成千上万个随机、奇怪且意想不到的物体,看看它们是否会发生碰撞、损坏或发生故障。其目标是在车辆驶上公路之前找到薄弱环节。

这篇论文提出了一个简单但至关重要的问题:车辆所使用的材料类型是否会改变它们损坏的频率、损坏的类型以及修复它们的难易程度?

研究人员查看了来自 550 多个真实世界项目(即“车辆”)的数据,这些项目一直在接受 Google “OSS-Fuzz”系统的持续测试。以下是他们的发现,用通俗易懂的语言进行了解释:

1. 它们损坏得有多频繁?(频率)

想象一下向靶子投掷飞镖。

  • C++ 和 Rust 就像是稍微有些“跳跃”的靶子。它们不会一直损坏,但当它们损坏时,频率变化很大。有时它们非常稳定;有时则会显示出很多缺陷。
  • Python 就像是一个非常稳定、安静的靶子。它损坏的次数最少,且模式非常一致。
  • C、Go 和 Java 处于中间位置,以稳定的平均速率发生损坏。

核心结论: 材料很重要。有些语言在受到冲击时更容易表现出缺陷,而有些语言则更加一致。

2. 会发生什么样的损坏?(缺陷类型)

当车辆确实发生损坏时,损坏的性质完全取决于材料。

  • “内存”问题 (C & C++): 这些语言就像是驾驶员必须手动管理油箱和机油的车辆。如果他们忘了,引擎就会爆炸。研究发现,C 和 C++ 主要遭受的是资源管理类缺陷——例如内存耗尽或缓冲区溢出。这些是“经典”的崩溃。
  • “逻辑”问题 (Python, Java, Rust): 这些语言拥有自动安全功能(比如智能燃油系统)。它们很少出现内存耗尽的情况。相反,它们的损坏是因为控制流问题——比如驾驶员试图在只能向右转的道路上左转。
  • “严重程度”的惊喜:
    • Java 在原始数量上损坏的次数最多,但几乎所有这些损坏都是中等严重程度的(比如爆胎)。这些虽然很烦人,但很少是灾难性的,因为 Java 的安全特性防止了引擎爆炸。
    • Python 和 Rust 损坏的次数较少,但一旦发生,损坏都是关键性的(比如刹车失灵)。
    • C 和 C++ 也倾向于出现关键性的、高严重程度的崩溃。

3. 我们能否复现损坏?(可复现性)

如果一辆车撞了,你能否让它以完全相同的方式再次撞车,以便机械师进行修理?

  • Rust 是这方面的冠军。它就像一辆车,一旦发生碰撞,你可以按下按钮,它 99% 的情况下会以完全相同的方式再次发生碰撞。这使得修复它变得非常容易。
  • Go 则恰恰相反。它就像一辆随机撞车的车。有时它会撞车,有时不会,而且你无法预测何时发生。这使得机械师很难弄清楚到底出了什么问题。
  • C、C++ 和 Python 处于两者之间,但 Rust 在复现错误方面显然是最可靠的。

4. 我们能多快发现损坏?(效率)

这里可能会让你感到违反直觉。你可能会认为,如果一种语言更擅长测试新代码(高覆盖率),它就会更快地发现缺陷。

  • “高覆盖率”陷阱: Go 和 Python 非常擅长测试新代码(它们覆盖了大量领域)。然而,它们实际发现缺陷所需的时间却最长(有时需要数周时间)。
  • “低覆盖率”速度者: C、C++、Java 和 Rust 虽然覆盖的新代码较少,但发现缺陷的速度快得多(通常在几天内)。

核心结论: 仅仅测试大量的代码并不意味着你会快速发现缺陷。语言本身决定了发现的速度。

总结:为什么这很重要?

论文得出结论:并非一种方案适用于所有情况。

如果你是一名安全检查员(或开发者):

  • 不要指望 C/C++ 的表现会像 Python 那样。它们的损坏方式、速度以及严重程度都各不相同。
  • 如果你使用 Java,请预料到会有许多缺陷,但大多是“烦人”的类型,而非“灾难性”的类型。
  • 如果你使用 Rust,你会得到非常可靠、易于复现的缺陷,但这些缺陷很罕见。
  • 如果你使用 Go,请准备好应对难以复现的缺陷。

研究人员建议,我们用于寻找这些缺陷的工具(“模糊测试器”)需要针对特定的语言进行定制,就像机械师需要针对钢制引擎和智能材料引擎使用不同的工具一样。你不能对每种车辆都使用同样的策略。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →