← 最新论文
💻 computer science

Semantic Spectrum: Fault Localization via Method Behavioral Divergence

本文提出了基于语义谱的故障定位(SSFL),这是一种利用运行时输出值分布来构建语义谱的方法级方法,通过无需模型训练或在线推理,实现了比传统的基于谱的方法、基于学习的方法以及基于大语言模型的方法更优越的故障定位准确度。

原作者: Tu Peng, Xianju Zheng, Yin Kuang, Abdelmounaim Mekaoui, Yazhi Yang, Ling Xiong

发布于 2026-08-20
📖 1 分钟阅读☕ 轻松阅读

原作者: Tu Peng, Xianju Zheng, Yin Kuang, Abdelmounaim Mekaoui, Yazhi Yang, Ling Xiong

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

在现代软件那庞大而复杂的机器运作中,一个错误的指令就可能导致全球性服务的瘫痪,造成数百万美元的损失并使数百万用户陷入困境。当程序出错时,工程师的首要任务不仅是修复代码,更要找到错误隐藏的确切位置。这一过程被称为故障定位(fault localization),长期以来一直依赖于一种被称为基于谱系的故障定位(spectrum-based fault localization)的方法。想象一个监控摄像头系统,它仅仅记录了一个人在顺利的一天里进入了哪些房间,以及在发生事故的一天里进入了哪些房间。如果那个人在两种情况下都走过了同一条走廊,摄像头就无法分辨出哪条路径导致了错误。几十年来,软件调试工具一直遵循着同样的原则:它们追踪在测试通过和测试失败时执行了哪些行代码。如果一行代码在成功测试和失败测试中都运行了,传统工具会将它们视为同样可疑,往往导致开发者面对一长串完全相同的候选名单,却无法分辨出真正的罪魁祸首。

这种由于不同的代码片段在追踪系统中看起来完全一致而导致的根本局限性,已成为软件可靠性的主要瓶颈。研究人员最近尝试通过使用复杂的人工智能来猜测错误位置,或者通过分析代码变更的历史来解决这一问题,但这些方法通常需要海量的训练数据或昂贵的计算能力。来自成都理工大学和北京语言大学的研究团队提出了一条不同的路径。他们不再关注程序进入了哪些“房间”,而是决定倾听程序离开时“说了什么”。他们提出的这种名为“语义谱系故障定位”(Semantic Spectrum-based Fault Localization)的新方法,将关注点从代码所走的路径转向了它产生的实际数值。通过将程序的输出视为一种独特的指纹,他们找到了一种能够识别此前标准工具无法察觉的错误的方法,能够在无需训练任何人工智能模型的情况下,以显著更高的速度和准确度识别故障来源。

这种新方法背后的核心思想简单而深刻:即使两段代码遵循完全相同的程序路径,当出现错误时,它们产生的执行结果往往也是不同的。在典型的软件测试中,程序运行一系列步骤并返回一个值,例如一个数字、一个单词或一个真假值。当软件正常工作时,这些返回值遵循一种可预测的模式。当存在漏洞(bug)时,即使执行的代码步骤相同,模式也会发生变化。研究人员意识到,通过捕获这些输出值并分析在成功测试与失败测试中特定结果出现的频率,他们可以创建一个“语义谱系”。这个谱系就像是一张详细的程序行为地图,不仅展示了程序去了哪里,还展示了它实际做了什么。

为了验证这一理论,该团队将此方法应用于包含 357 个真实世界软件漏洞的知名集合,这些漏洞分布在五个不同的 Java 项目中,涵盖了从数学库到日期处理工具等各种类型。他们使用一种专门的工具,在每次测试运行时拦截代码中每个方法的输出。对于每个方法,他们构建了两个剖面(profile):一个显示通过测试时的输出分布,另一个显示失败测试时的输出分布。然后,他们通过比较这两个剖面来衡量行为偏离了多少。如果一个方法在通过测试和失败测试中返回相同的值,那么它很可能是无辜的。但如果返回值的模式发生了剧烈变化——例如,一个通常返回“true”的方法在失败测试中突然开始返回“false”——系统就会将其标记为高度可疑。

实验结果令人瞩目。与仅依赖追踪代码执行路径的最佳传统工具相比,这种新方法将开发者需要检查的可疑对象数量减少了 60% 到 90%。在一些较大的项目中,传统工具会让开发者在数十行同样可疑的代码中苦苦搜寻,而新方法能将实际错误定位在列表的更靠前位置。这种改进非常显著,在测试的最大型项目中,研究人员将正确错误的平均排名位置从 71.63 降低到了 6.88,这意味着搜索工作量减少了 90.4%。这是传统方法无法实现的成就。该方法在解决“平局问题”(tie problem)方面表现得尤为出色,即传统工具因为多个方法看起来完全一致而失效的情况。通过倾听输出,新方法即使在两者行走路径相同的情况下,也能听出正确方法与错误方法之间的区别。

研究人员还将他们的技术与最新一代基于人工智能的工具进行了对比,后者通常需要对海量数据集进行训练,或使用强大的语言模型来阅读并理解代码。他们的方法无需训练,也无需复杂的 AI 推理,其表现优于最强的基于学习的基准工具 HetFL,在排名前三和前五的列表中识别出了更多的漏洞。具体而言,该方法在 Top-3 和 Top-5 位置分别定位了 242 个和 262 个漏洞,而 HetFL 分别为 195 个和 228 个。这表明,程序产生的数据本身比 AI 模型试图学习的复杂模式更直接、更可靠。该方法也是确定性的(deterministic),这意味着它每次都会产生相同的结果,不像某些 AI 系统那样可能会给出不同的答案。

该发现最实用的方面之一在于其高效性。虽然捕获输出值的过程会为测试阶段增加少量时间(每个软件版本约增加 7 秒),但其带来的精度提升是巨大的。研究人员发现,为了能够跳过数小时的手动搜索,付出这点额外的时间代价是非常值得的。该方法通过将软件的原始输出转换为统一格式,将数字、单词和真假值视为一种通用的 Token(标记)语言。随后,它统计每个 Token 在通过测试与失败测试中出现的频率。如果某个特定的 Token 在失败测试中频繁出现但在通过测试中很少出现,或者 Token 的平衡发生了剧烈偏移,系统就会知道出了问题。这种方法不需要重写软件,也不需要开发者提供额外信息;它只是在倾听现有测试已经在产生的内容。

研究还强调了现有方法的局限性。当漏洞没有改变代码采取的路径,而仅仅改变了它产生的数据时,传统工具往往会失效。同样,软件中的某些复杂对象在打印时不会产生清晰的文本,这使得它们难以用此方法进行分析。研究人员指出,他们的系统目前无法检测代码中不返回数值或不改变变量的部分,例如某些类型的初始化设置函数。然而,对于绝大多数标准的软件函数,通过比较输出分布来提供一个强大的调试新视角是非常有效的。

通过将关注点从代码结构转向数据行为,这项研究为一个老问题提供了全新的视角。它证明了寻找软件漏洞的答案往往不在于观察代码去了哪里,而在于倾听它到达时说了什么。研究结果表明,通过将程序的输出视为丰富的诊断信息来源,工程师可以比以往更快速、更准确地定位错误,且无需承担训练人工智能模型的沉重成本。随着软件系统不断变得复杂,基于实际产生结果来区分正确路径与错误路径的能力,可能会成为保持数字世界平稳运行的重要工具。这项工作证实了,有时,寻找错误最有效的方法就是去留意“应当发生的情况”与“实际发生的情况”之间的差异。

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

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

试用 Digest →