[论文阅读] 软件测试 | 跨语言模糊测试大揭秘:C++/Rust/Python谁更胜一筹?

跨语言模糊测试大揭秘:C++/Rust/Python谁更胜一筹?

论文信息

  • 原标题:Does Programming Language Matter? An Empirical Study of Fuzzing Bug Detection
  • 主要作者及机构:Tatsuya Shirai(日本奈良先端科学技术大学院大学)、Olivier Nourry(日本大阪大学)、Yutaro Kashiwa(日本奈良先端科学技术大学院大学)、Kenji Fujiwara(日本奈良女子大学)、Hajimu Iida(日本奈良先端科学技术大学院大学)
  • 会议:23rd International Conference on Mining Software Repositories (MSR '26),2026年4月13-14日,巴西里约热内卢
  • GB/T 7714引文格式:SHIRAI T, NOURRY O, KASHIWA Y, et al. Does programming language matter? An empirical study of fuzzing bug detection[C]//23rd International Conference on Mining Software Repositories, Rio de Janeiro, Brazil, 2026. New York: ACM, 2026.
  • DOIhttps://doi.org/10.1145/3793302.3793358
  • 数据集开源地址https://doi.org/10.5281/zenodo.18264483

研究背景

在软件开发领域,模糊测试 是自动化检测程序漏洞的"利器"------它通过生成大量异常输入,触发程序的意外行为(如崩溃、内存溢出),从而发现安全漏洞和程序bug。如今,模糊测试已深度融入持续集成(CI)流水线,形成持续模糊测试,以短周期、高频次的测试模式,在代码开发过程中快速发现漏洞,解决了传统模糊测试配置复杂、算力成本高的问题。

作为目前最主流的持续模糊测试服务,Google的OSS-Fuzz已为超1000个核心开源项目提供测试,累计发现13000余个漏洞和50000余个bug,OpenSSL、Kubernetes、TensorFlow等知名项目均受益于此。

但一个关键问题始终被学界和工业界忽略:编程语言是否会影响持续模糊测试的效果?

不同编程语言的设计原则和安全保障天差地别:比如Rust通过编译期检查实现内存安全,C/C++则提供底层内存控制但牺牲了安全性,Python作为动态语言拥有灵活的运行时特性。此前的研究要么是"语言无关"的泛化分析,要么仅针对单一语言展开,从未通过大规模实证,探究编程语言对模糊测试的漏洞检测频率、漏洞特征、可复现性、检测效率的系统性影响。

就像不同的工具适合不同的材质加工,不同的编程语言是否也会让模糊测试这个"检测工具"发挥出不同的效果?这正是本研究要回答的核心问题。

创新点

  1. 首次开展大规模跨语言持续模糊测试实证研究:突破现有研究"语言无关"或"单一语言"的局限,基于OSS-Fuzz平台的559个项目、6万余个漏洞、近百万次构建,对C、C++、Go、Java、Python、Rust六大主流语言展开系统性对比分析,填补了领域空白。
  2. 揭示了反直觉的模糊测试效率规律:打破"高代码覆盖率必然带来早漏洞检测"的传统认知,发现Go、Python等补丁覆盖率高的语言,反而漏洞检测耗时更长,证明该规律在模糊测试中不具备跨语言普适性。
  3. 建立了编程语言与模糊测试特征的强关联模型:明确不同语言在漏洞检测、漏洞类型、可复现性、检测效率上的独特特征,为"语言感知型"模糊测试工具开发和策略设计提供了直接的实证依据。
  4. 提出了多维度的模糊测试效果评估体系:从检测频率、漏洞占比/严重程度/类型、漏洞可复现性、补丁覆盖率、检测耗时五个维度构建评估指标,为后续跨语言模糊测试研究提供了标准化的分析框架。

研究方法和思路

本研究以**"提出问题---数据收集---指标定义---统计分析---结论验证"**为核心思路,采用非参数统计方法完成全流程分析,步骤拆解如下:

步骤1:确定核心研究问题(RQ)

围绕模糊测试的核心效果维度,提出4个关键研究问题,构成研究的整体框架:

  • RQ1:持续模糊测试的漏洞检测频率是否因编程语言而异?
  • RQ2:模糊测试发现的漏洞类型、严重程度是否存在跨语言差异?
  • RQ3:不同语言下,模糊测试漏洞的可复现性是否不同?
  • RQ4:编程语言是否会影响模糊测试的检测效率(补丁覆盖率+检测耗时)?

步骤2:大规模数据收集与严格筛选

数据均来自Google OSS-Fuzz平台,经过三轮筛选保证数据的有效性和代表性,最终确定研究样本:

  1. 漏洞报告筛选:初筛68495份报告→过滤出"已修复/弃修"的已解决报告63652份→仅保留检测到≥10个漏洞的项目,最终得到559个项目的61444份有效漏洞报告;
  2. 构建日志筛选:初筛466万份构建日志→匹配目标研究项目,得到999248份有效日志,用于计算漏洞检测频率;
  3. 覆盖率报告收集:收集669015份日度覆盖率报告,用于计算补丁覆盖率;
  4. 研究语言确定 :根据项目主语言分类,剔除Swift、JavaScript等样本量不足的语言,最终聚焦C、C++、Go、Java、Python、Rust六大语言。

步骤3:定义核心评估指标

针对4个研究问题,定义对应的量化指标,确保分析的可操作性:

研究问题 核心指标 指标定义
RQ1 漏洞检测频率 单个项目的漏洞数量/该项目的构建总次数,单位:个/构建
RQ2 漏洞占比、严重程度、崩溃类型 1.漏洞占比:漏洞数量/总bug数量;2.严重程度:OSS-Fuzz定义的S1(高危)-S4(低危);3.崩溃类型:基于CWE分类的7类(资源管理、控制流等)
RQ3 漏洞可复现率 可复现漏洞数量/总漏洞数量,OSS-Fuzz直接标注漏洞"可复现/不可复现"
RQ4 补丁覆盖率、检测耗时(TTD) 1.补丁覆盖率:模糊测试覆盖的修改代码量/总修改代码量;2.检测耗时:漏洞引入日期到检测日期的天数

步骤4:采用标准化统计分析方法

为避免数据正态性假设的限制,采用非参数统计检验,分两步验证结果的统计学显著性:

  1. 整体差异检验:使用Kruskal--Wallis检验(α=0.05),验证六大语言在各指标上是否存在显著整体差异;
  2. 两两差异检验 :若整体差异显著,使用Holm校正的Mann-Whitney U检验(α=0.05),确定具体哪两组语言间存在显著差异。

步骤5:结果可视化与规律总结

通过箱线图、小提琴图、热图等方式对统计结果进行可视化,提炼各语言在不同指标上的核心特征,回答4个研究问题,并形成语言与模糊测试效果的关联规律。

主要成果和贡献

本研究通过大规模实证分析,得到了4个核心研究结论,并为学界和工业界提供了直接的应用价值,核心成果用大白话总结如下:

核心成果:四大研究问题的关键答案

为方便对比,将各语言的核心特征和研究结论整理为表格,所有结论均通过统计学显著性检验:

研究问题 核心结论 各语言关键特征
RQ1:检测频率 所有语言检测率整体偏低(中位数≈0.02个/构建),但分布差异显著;C++/Rust检测率略高,Python最低且最集中 C/C++/Go/Java:中位数≈0.02个/构建;C++/Rust:0.025个/构建,分布范围最广;Python:0.014个/构建,分布最集中
RQ2:漏洞特征 1.漏洞占比:Java最高(46.3%),Rust/Python<10%;2.严重程度:Java全为中危(S3),Python高危(S1)占比75%(最高);3.崩溃类型:C/C++/Go以资源管理漏洞为主,Java/Python/Rust以控制流漏洞为主 1.C/C++:资源管理漏洞占比近50%;2.Python:控制流漏洞79%、S1漏洞75%;3.Java:唯一出现保护机制漏洞的语言;4.Rust:控制流漏洞47%,资源管理漏洞26.4%(远低于C/C++)
RQ3:可复现性 跨语言差异极大,Rust最优,Go最差,C/C++/Python/Java中等 Rust:中位数98.8%,几乎无不可复现漏洞;Go:中位数50%,分布最广;C/C++/Python/Java:80%-95%
RQ4:检测效率 补丁覆盖率与检测耗时呈负相关(反直觉);Go/Python覆盖率高但耗时久,C/C++/Java/Rust覆盖率低但耗时短,Python耗时最长 1.补丁覆盖率:Go30.2%、Python22.9%(最高),其余语言<10%;2.检测耗时:Java2.8天(最快)、Rust3.9天、C7天、C++9.5天、Python26.8天(最慢)

研究的核心贡献

对学术界的贡献
  1. 填补了跨语言持续模糊测试实证研究的空白,为后续研究提供了标准化的数据样本、评估指标、统计方法
  2. 推翻了"高覆盖率=早检测"的传统认知,揭示了模糊测试效率的跨语言独特规律,为模糊测试理论研究提供了新方向;
  3. 明确了编程语言设计与模糊测试效果的强关联,为语言感知型模糊测试的理论构建奠定了实证基础。
对工业界的贡献
  1. 编程语言选择提供了直接参考:根据项目的安全需求(如是否容忍高危漏洞)、测试需求(如是否需要快速检测)选择合适的语言,比如对高危漏洞零容忍选Rust,对检测速度有要求选Java/Rust;
  2. 模糊测试工具开发 指明方向:需开发语言专属的模糊测试工具,比如C/C++工具聚焦资源管理漏洞检测,Python工具聚焦控制流漏洞检测;
  3. 模糊测试策略优化 提供方案:对Go/Python等覆盖率高但耗时久的语言,优化输入生成算法以缩短检测时间;对C/C++/Java/Rust等覆盖率低的语言,引入定向灰盒模糊测试(DGF),提升对新修改代码的覆盖;对Go项目,优化测试配置以提升漏洞可复现性。

一段话总结

这篇发表于MSR '26的实证研究以559个OSS-Fuzz项目61,444个模糊测试漏洞999,248次构建 为样本,开展跨编程语言的模糊测试漏洞检测分析,发现编程语言设计对模糊测试的漏洞检测频率、漏洞特征、可复现性及检测效率存在显著影响:C++和Rust 漏洞检测频率更高,Rust和Python 漏洞占比低但高危漏洞更多,Go 的不可复现漏洞最多而Rust 几乎无此问题,Python 补丁覆盖率高但检测耗时最长;同时不同语言的漏洞类型差异显著,C/C++/Go 以资源管理类漏洞为主,Java/Python/Rust 则以控制流类漏洞居多,该研究为语言感知型模糊测试策略和工具开发提供了关键实证依据。


思维导图


详细总结

本研究是由日本多所高校团队完成的跨编程语言持续模糊测试实证研究,发表于2026年第23届软件仓库挖掘国际会议(MSR '26),核心旨在探究编程语言设计是否及如何影响模糊测试的漏洞检测效果,通过对OSS-Fuzz平台的大规模数据挖掘和分析,填补了现有语言无关性模糊测试研究的空白,为语言感知型模糊测试策略开发提供了实证依据。

一、研究基础与数据来源
  1. 研究背景
    持续模糊测试将模糊测试集成至持续集成(CI)流水线,以短周期、高频次测试实现漏洞快速检测,OSS-Fuzz是目前最主流的持续模糊测试服务,支持C、C++、Rust、Go、Python、Java等6种语言,已发现超13000个漏洞和50000个bug。现有研究多为语言无关性单一语言分析,未探究编程语言设计对测试效果的核心影响。

  2. 数据收集与筛选
    研究对OSS-Fuzz平台的漏洞报告、构建日志、覆盖率报告进行多轮筛选,最终确定核心研究样本,关键数据如下:

    数据类型 初筛数量 最终筛选数量 筛选标准
    漏洞报告 68,495份 61,444份 筛选已解决(修复/弃修)、适配≥10个漏洞的项目
    构建日志 4,660,639份 999,248份 匹配目标研究项目
    覆盖率报告 669,015份 669,015份 用于补丁覆盖率计算
    研究项目 1,311个 559个 主语言为C/C++/Go/Java/Python/Rust,且≥10个检测漏洞
  3. 研究方法
    采用非参数统计方法,通过Kruskal--Wallis检验 验证不同语言间指标的整体差异,再通过Holm校正的Mann-Whitney U检验进行事后检验,确定具体语言对的差异显著性,检验显著性水平α=0.05。

二、四大核心研究问题与关键发现

本研究围绕检测频率、漏洞特征、可复现性、测试效率四大维度提出4个研究问题,均得到统计学上的显著结论,核心数字和发现如下:

  1. RQ1:漏洞检测频率的跨语言差异

    • 所有语言的模糊测试漏洞检测率整体偏低,中位数约0.02个/构建
    • C、Go、Java中位数检测率近乎一致(≈0.02个/构建),C++和Rust略高(0.025个/构建)且分布范围最广(长尾可达0.15-0.45个/构建);
    • Python检测率最低(0.014个/构建),且分布最集中,几乎无高检测率样本;
    • 统计检验显示,C++与Python、Java与Python的检测率存在显著差异。
  2. RQ2:漏洞类型与严重程度的跨语言差异

    漏洞占比、严重程度、崩溃类型三个维度分析,差异显著:

    • 漏洞占比:Java最高(46.3%),C/C++接近整体水平(23.48%),Rust和Python<10%
    • 严重程度:Java的漏洞几乎全为中危(S3) ,C/C++/Go/Rust以高危(S1/S2)为主,Python的S1级高危漏洞占比达75%,为所有语言最高,S4级低危漏洞在所有语言中均罕见;
    • 崩溃类型(按CWE分类):C/C++/Go资源管理类漏洞 为主(C:48.6%、C++:50.7%),Java/Python/Rust控制流类漏洞为主(Python:79.0%、Java:50.2%、Rust:47.0%),Java是唯一出现保护机制类漏洞的语言,Rust虽以控制流漏洞为主,但仍有26.4%的资源管理类漏洞。
  3. RQ3:漏洞可复现性的跨语言差异

    可复现性是漏洞修复的关键指标,不同语言表现差异极大:

    • Rust 最优,中位数可复现率98.8%,且分布高度集中在100%附近,几乎无不可复现漏洞;
    • Go最差,中位数可复现率仅50%,且分布范围最广,是唯一中位数低于80%的语言;
    • C/C++/Python/Java表现中等,可复现率为80%-95%,分布相对集中;
    • 统计检验显示,除C与C++、C与Python、Java与Python外,其余语言对的可复现性均存在显著差异。
  4. RQ4:模糊测试效率的跨语言差异

    补丁覆盖率检测耗时(TTD)为核心效率指标,发现反直觉的负相关关系

    • 补丁覆盖率:Go(30.2%)和Python(22.9%)显著高于其他语言,C/C++/Java/Rust的中位数均低于10%
    • 检测耗时:Java(2.8天)和Rust(3.9天)最快,C(7.0天)和C++(9.5天)次之,Python最慢(26.8天),是唯一中位数超20天的语言;
    • 核心结论:高补丁覆盖率并未带来早检测,该传统测试的认知在模糊测试中不具备跨语言普适性
    • 统计检验显示,除Rust与Java外,其余语言对的检测耗时均存在显著差异(Go因数据缺失未纳入本分析)。
三、研究启示与应用价值

研究针对研究者、模糊测试平台提供者、行业从业者三类主体,提出针对性启示:

  1. 对研究者 :需摒弃语言无关性研究思路,聚焦语言特定漏洞分析;需验证Python高比例控制流漏洞是语言本身特性,还是现有模糊测试技术对Python的其他漏洞检测能力不足。
  2. 对平台提供者 :开发语言专属模糊测试工具 (如C/C++工具聚焦资源管理漏洞,Python工具聚焦控制流漏洞);引入定向灰盒模糊测试(DGF),解决多数语言补丁覆盖率偏低的问题。
  3. 对从业者:根据项目安全需求选择编程语言------Java适合对高危漏洞敏感的场景,Rust兼顾低漏洞占比、高可复现性和快检测速度,Python虽补丁覆盖率高,但需容忍低检测率、高高危漏洞占比和长检测耗时;Go项目需重点解决漏洞可复现性问题,降低调试成本。
四、研究的威胁与局限性
  1. 内部效度:筛选≥10个漏洞的项目可能存在选择偏差,检测率差异或源于项目特征而非语言本身;
  2. 构念效度:项目成熟度、模糊测试配置等混杂因素可能影响结果,研究通过中位数分析缓解了该偏差,但未完全消除;
  3. 外部效度:研究样本仅为OSS-Fuzz平台的开源项目,结果难以泛化至其他模糊测试工具、非OSS-Fuzz项目或商业项目;且样本筛选后规模缩小,一定程度影响结果的普适性。
五、研究结论与未来方向
  1. 核心结论 :编程语言设计显著塑造 了模糊测试的漏洞特征和检测效率,尽管不同语言的漏洞检测频率、检测效率整体相近,但漏洞性质、可复现性 存在本质差异;语言的安全保障机制(如Rust的内存安全、Java的垃圾回收)与模糊测试效果高度相关,验证了语言感知型模糊测试的必要性。
  2. 未来方向:采用回归断点设计(RDD)探究跨语言差异的核心成因;深入分析语言特定漏洞,验证Python等语言的漏洞类型分布是否由测试技术局限导致;进一步优化语言专属模糊测试工具的设计和实现。

关键问题

问题1:该研究中,Rust作为内存安全语言,在模糊测试中展现出哪些核心优势和少量不足?

答案:Rust的核心优势体现在三方面:1. 漏洞检测频率较高(中位数0.025个/构建),且分布范围广;2. 漏洞占比极低(低于10%),大幅降低安全风险;3. 漏洞可复现性最优(中位数98.8%),几乎无不可复现漏洞,且检测耗时较短(中位数3.9天)。少量不足为:仍存在26.4%的资源管理类漏洞,虽远低于C/C++,但未完全消除该类内存相关漏洞;同时补丁覆盖率偏低(低于10%),与C/C++/Java处于同一水平。

问题2:该研究发现模糊测试中"高补丁覆盖率≠早漏洞检测"的反直觉现象,哪些语言表现出该特征,其背后可能的原因是什么?

答案Go和Python是该特征的典型代表,其中Go补丁覆盖率30.2%、Python22.9%,均为研究中最高水平,但Python检测耗时长达26.8天(所有语言最长),Go因数据缺失未纳入检测耗时分析,而其他低补丁覆盖率语言(C/C++/Java/Rust)均实现了快速检测。背后可能的原因:1. Python作为动态类型语言,运行时灵活性虽提升了补丁覆盖率,但也导致模糊测试的输入探索和漏洞触发更复杂,延长检测时间;2. C/C++/Rust等语言的高结构复杂度导致补丁覆盖率低,但这类语言的漏洞多为内存相关,更易被模糊测试的输入触发,因此检测耗时更短;3. 高补丁覆盖率语言的漏洞多为控制流类,这类漏洞的触发条件更复杂,需要更长时间的输入生成和探索。

问题3:该研究对企业和开发团队在项目编程语言选择和模糊测试实践上,提供了哪些具体的决策参考?

答案 :具体决策参考分为两方面:1. 编程语言选择 :若项目对高危漏洞零容忍、注重低安全风险,优先选择Rust(漏洞占比<10%、可复现性近100%、检测耗时短);若项目对漏洞严重程度敏感,需避免高危漏洞,优先选择Java(漏洞均为中危S3);若项目依赖CI流水线的高频测试、注重补丁覆盖率,可选择Go/Python,但需接受Python的高高危漏洞占比和长检测耗时,以及Go的低漏洞可复现性;C/C++则适合对漏洞检测频率有要求,但需做好资源管理类漏洞的防护。2. 模糊测试实践:针对所选语言定制测试策略,C/C++项目重点检测资源管理类漏洞,Python/Java/Rust重点检测控制流类漏洞;对Go项目需优化模糊测试配置,提升漏洞可复现性,降低调试成本;对Python项目需改进模糊测试技术,缩短控制流类漏洞的检测耗时;对C/C++/Java/Rust等低补丁覆盖率语言,引入定向灰盒模糊测试(DGF),提升对新修改代码的测试覆盖。

开源价值

研究提供了完整的数据集开源地址https://doi.org/10.5281/zenodo.18264483),包含筛选后的漏洞报告、构建日志、覆盖率报告及统计分析代码,方便其他研究者进行复现和后续研究。

总结

本研究是首份针对六大主流编程语言的大规模持续模糊测试实证研究,基于OSS-Fuzz平台的559个开源项目、61444个模糊测试漏洞和999248次构建,从检测频率、漏洞特征、可复现性、检测效率四个维度,系统探究了编程语言对模糊测试效果的影响。

研究的核心结论是:编程语言设计对模糊测试的效果存在显著且系统性的影响------尽管所有语言的漏洞检测频率整体相近,但在漏洞类型、严重程度、可复现性、检测效率上呈现出截然不同的特征:C++/Rust检测频率更高,Rust/Python漏洞占比低但高危漏洞更多,Rust的漏洞可复现性近乎完美而Go最差,Python补丁覆盖率高但检测耗时最长,且补丁覆盖率与检测耗时的负相关关系打破了传统测试认知。

该研究不仅填补了领域空白,更为学界提供了标准化的研究框架,为工业界的编程语言选择、模糊测试工具开发和策略优化提供了直接的实证依据,推动模糊测试从"通用型"向**"语言感知型"**发展,让自动化漏洞检测更贴合不同编程语言的特性,从而提升测试效率和安全性。

相关推荐
寻寻觅觅☆6 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc7 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
ceclar1238 小时前
C++使用format
开发语言·c++·算法
lanhuazui108 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee448 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
老约家的可汗9 小时前
初识C++
开发语言·c++
crescent_悦9 小时前
C++:Product of Polynomials
开发语言·c++
艾尔aier9 小时前
mini-shell成果展示
rust
小坏坏的大世界9 小时前
CMakeList.txt模板与 Visual Studio IDE 操作对比表
c++·visual studio
乐观勇敢坚强的老彭10 小时前
c++寒假营day03
java·开发语言·c++