← 最新论文
💻 computer science

DRReduce: Enhancing Syntax-Guided Program Reduction with Dependency Reconstruction

DRReduce 是一种与语言无关的程序归约框架,它通过引入依赖重构来修复删除操作后的语义连贯性,从而提升基于语法搜索的效率与效果,在尺寸缩减和速度方面均优于当前最先进的通用归约工具及特定语言工具。

原作者: Qiong Feng, Xiaotian Ma, Yongqiang Tian, Wei Song, Peng Liang

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

原作者: Qiong Feng, Xiaotian Ma, Yongqiang Tian, Wei Song, Peng Liang

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

想象你是一名侦探,试图解开一个谜团。你面对的是一个巨大而混乱的犯罪现场(一个庞大的计算机程序),它引发了一场灾难(一个错误或崩溃)。你的目标是剥离所有不必要的部分,直到只剩下能够重现这场灾难的绝对最小、最简单的场景。这被称为程序缩减

为什么要这样做?因为如果你能向开发者展示一个仅 10 行代码的微小片段,而这个片段却会导致软件崩溃,他们就能在几分钟内修复它。如果你给他们展示一个 10 万行的文件,他们可能会直接放弃。

问题所在:“蒙眼”的清洁工

长期以来,用于这项工作的最佳工具就像蒙眼的清洁工。它们能够根据代码的“形状”(语法)来删除内容,但并不理解代码实际“意味着”什么(语义)。

想象一栋拥有复杂管道系统的房子。

  • 蒙眼的清洁工(旧工具): 他们看到一根管道,心想:“我删掉这根管道,让房子变小。”但他们没意识到这根管道连接着水槽。如果切断它,水槽就会漏水,房子也就毁了。“属性检查器”(检查员)会说:“这房子坏了!你不能删掉那根管道!”于是,清洁工不得不把管道装回去,尝试其他方法。他们浪费数小时尝试成千上万种组合,最终却因破坏管道系统而失败。
  • 特定语言专家(旧专用工具): 这些就像精通这栋特定房子建造方式的大师级水管工。他们确切知道哪些管道可以移除而不会导致漏水。他们很出色,但只适用于这栋房子。如果你给他们一栋拥有不同管道系统的房子,他们就毫无用处。每遇到一栋新房子,你都得雇佣一位新的大师级水管工。

解决方案:DRReduce(“智能”清洁工)

本文的作者构建了DRReduce,这是一种新工具,它充当智能且适应性强的清洁工

DRReduce 不仅查看代码的形状,还构建了一张依赖关系图(一张“谁需要谁”的示意图)。

  1. 它看见连接: 它知道,如果你删除一个函数,还必须修复调用该函数的所有位置。
  2. 它执行“依赖重构”: 这是魔法所在。
    • 场景 A(断裂的链接): 如果清洁工删除了一个函数,但代码的其他部分仍试图使用它,DRReduce 不会留下一个空洞。它会立即用一个“虚拟”占位符(例如通用的"1"或"null")填补这个空洞,使代码仍能编译和运行。它在移除家具的同时,保持房子屹立不倒。
    • 场景 B(纠缠的绳结): 有时,两样东西相互依赖,形成循环(例如参数与其传递的实参)。如果你删除其中一个,另一个就会崩溃。DRReduce 能识别出这种绳结,并同时切除两部分,而不是卡在试图只切除其中一部分的困境中。

结果:更快、更小

作者在两种流行语言(CJava)的真实世界计算机错误上测试了 DRReduce。

  • 与“蒙眼”清洁工(如 Perses、WDD)相比:
    DRReduce 生成的程序平均小了 51.9%。在许多测试中,它也更快完成了任务,因为它没有浪费时间尝试删除那些会破坏代码的内容。它完全避免了“漏水的水槽”问题。
  • 与“大师级水管工”(如 CReduce)相比:
    通常,精通特定语言的大师级水管工能得出最小的结果。DRReduce 虽然不掌握任何特定语言的规则,却能达到与专家同样小的结果。更棒的是,它比专家级的 C-Reducer快 3.3 倍,因为它无需为每一栋房子手动检查成千上万条特定规则。

核心结论

DRReduce 是一个巧妙的中间方案。它无需精通每一种编程语言就能出色地完成任务。相反,它采用了一种智能策略,在删除代码的同时“修复”它,确保程序在清理过程中永远不会崩溃。

  • 旧方法: 尝试删除某物 -> 代码崩溃 -> 撤销 -> 再试一次。(缓慢、混乱)。
  • DRReduce 方法: 看清你要删除什么 -> 立即修复断裂的连接 -> 删除它。(快速、干净,并能达到最小尺寸)。

论文总结道,通过添加这个“修复”步骤,他们可以将测试时间减少近 60%,将错误报告的大小减少超过 50%,从而使软件开发者更容易修复他们的错误。

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

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

试用 Digest →