← 最新论文
💻 computer science

CrossLangFuzzer: Differential Testing of Cross-Language JVM Compilers

本文介绍了 CrossLangFuzzer,这是首个利用 Kotlin 编译器的统一中间表示和变异算子来合成跨语言测试程序的差异测试框架,成功发现了涵盖五种主要 JVM 编译器的 32 个已确认漏洞。

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

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

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

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

想象一下,Java 虚拟机(JVM)就像是一个规模宏大、繁忙的国际机场。在这个机场里,不同的航空公司(编程语言,如 Java、Kotlin、Scala 和 Groovy)都在使用相同的跑道和控制塔。通常情况下,它们相处得很好。但有时,来自一个国家的航空公司试图将一名乘客移交给另一家航空公司,由于两者的规则(例如“登机牌”即类型,或“行李限额”即空值性/nullability)略有不同,导致交接失败。

当这些交接失败时,飞机可能会坠毁,或者更糟的是,带着错误的乘客起飞,导致随后的混乱。这些被称为误编译(miscompilations)

问题所在:“无声的交接”

本文的作者注意到,虽然我们拥有出色的工具来测试单个航空公司如何运作(单独测试 Java 或单独测试 Kotlin),但我们缺乏有效的工具来测试它们之间是如何互动的。

可以这样理解:你可能有一个完美的测试,可以测试飞行员在晴朗天气下的飞行表现。但你还没有测试当这位飞行员必须与使用不同无线电频率的其他航空公司的飞行员通话时会发生什么。如果指令在对话过程中变得模糊不清,飞机就会坠毁。现有的测试忽略了这些语言之间的“对话”。

解决方案:CrossLangFuzzer

团队构建了一个名为 CrossLangFuzzer 的工具。你可以把它想象成一个专门设计用来破坏这些交接环节的超级机器人翻译官兼恶作剧者

它是这样工作的,分步骤如下:

  1. 通用蓝图(中间表示,IR):
    机器人不是直接用 Java 或 Kotlin 编写代码,而是首先绘制一张“通用蓝图”(称为中间表示或 IR)。这张蓝图就像是一张大师级的建筑图纸,它不在乎最终的建筑是用砖头(Java)还是木头(Kotlin)建造的。它只了解结构:“这里有一扇门,那里有一个窗户,上面有一个屋顶。”

  2. 翻译器(打印机):
    机器人获取这张通用蓝图,并立即将其同时打印成多种语言的真实代码。它可能会打印出一个 Java 版本、一个 Kotlin 版本和一个 Scala 版本,而这些版本具有完全相同的逻辑结构。

  3. 恶作剧者(变异器):
    这是有趣的部分。机器人拥有一套七种“恶作剧”招式。它获取蓝图,并故意以一种让编译器难以处理的方式对其进行扭曲。

    • 类比: 想象它拿走一个句子“猫坐在垫子上”,然后把“猫”换成“狗”,或者把“坐”改为“跳”,或者在不该有问号的地方加上问号。
    • 它会对类型和规则进行此类操作(例如,使一个数字变为可选,或改变一个泛型列表)。它试图迷惑编译器:“嘿,这在你看来还合理吗?”
  4. 裁判(差异测试):
    机器人将这些扭曲后的程序发送给实际的编译器(控制塔)。

    • 场景 A: 编译器 A 说:“这没问题!”而编译器 B 说:“错误!这坏掉了!”
    • 场景 B: 编译器 A 崩溃了,但编译器 B 继续运行。
    • 判决: 如果编译器们对代码是否有效产生了分歧,机器人就会将其标记为一个漏洞(bug)。这就像两位裁判针对同一次比赛动作吹响了不同的哨声。
  5. 侦探(简化器):
    当发现漏洞时,测试程序可能非常庞大且复杂。机器人扮演侦探的角色,逐一剥离代码中的部分,以找到导致崩溃的最小代码片段。这使得人类开发人员能够轻松查看代码并说:“啊,是的,我看到问题出在哪了。”

结果

团队针对 JVM 世界中五大“航空公司”测试了这个机器人:Java、Kotlin、Scala(版本 2 和 3)以及 Groovy。

这个机器人发现了 32 个已确认的漏洞

  • 它在 Kotlin 中发现了 15 个漏洞。
  • 在 Scala 3 中发现了 7 个。
  • 在 Groovy 中发现了 4 个。
  • 在 Java 中发现了 4 个。
  • 在 Scala 2 中发现了 2 个。

至关重要的是,这些并非仅仅是理论上的问题。这些语言的开发者确认了这些漏洞。事实上,Groovy 团队修复了机器人发现的所有漏洞,而 Kotlin 团队已经修复了一个,其余的已得到确认并正在等待补丁。

为什么这很重要

本文认为,随着软件变得越来越复杂并且混合使用不同的语言,我们不能再仅仅孤立地测试它们。我们需要一个专门针对这些语言交汇处的混乱、模糊边界进行测试的工具。CrossLangFuzzer 是第一个系统性地做到这一点的工具,它通过对 JVM 生态系统中的“交接”进行压力测试,以确保飞机能够安全飞行。

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

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

试用 Digest →