← 最新论文
🤖 machine learning

ExplainFuzz: Explainable and Constraint-Conditioned Test Generation with Probabilistic Circuits

本文提出了 ExplainFuzz,一种基于概率电路的测试生成框架,它通过学习语法感知的结构化分布并支持约束条件,显著提升了生成测试输入的合理性、可控性及触发软件缺陷的效率。

原作者: Annaëlle Baiget, Jaron Maene, Seongmin Lee, Benjie Wang, Guy Van den Broeck, Miryung Kim

发布于 2026-04-09
📖 1 分钟阅读☕ 轻松阅读

原作者: Annaëlle Baiget, Jaron Maene, Seongmin Lee, Benjie Wang, Guy Van den Broeck, Miryung Kim

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

这篇论文介绍了一个名为 ExplainFuzz 的新工具,它的任务是帮程序员生成“测试数据”来检查软件(比如数据库或编译器)有没有漏洞。

为了让你更容易理解,我们可以把整个软件测试过程想象成**“给一位挑剔的餐厅主厨(软件)送各种奇怪的食材(测试数据),看看他会不会被噎住或者把厨房炸了(发现 Bug)”**。

1. 以前的方法有什么毛病?

在 ExplainFuzz 出现之前,大家主要用三种方法来生成这些“食材”,但它们都有明显的缺点:

  • 老式“随机拼凑法”(传统 Fuzzing):
    • 比喻: 就像让一个只会背菜谱的机器人,随机把“盐”、“糖”、“酱油”倒进锅里。
    • 问题: 虽然倒进去的东西符合“盐、糖、酱油”的语法(比如都是液体),但组合起来可能是一碗“咸糖水”,根本没法吃(无效数据)。而且它只会围着原来的几样菜打转,很难发现新花样。
  • 大语言模型(LLM,如 ChatGPT):
    • 比喻: 就像请了一位博学但有点“神神叨叨”的大厨来写菜谱。
    • 问题: 他写出来的菜谱看起来很像那么回事,但你问他“为什么这里要放醋?”他却答不上来(黑盒,不可解释)。而且让他写一万种不同的菜谱,他可能会卡壳,或者写得不够快。
  • 概率上下文无关文法(pCFG):
    • 比喻: 就像给机器人设定了固定的概率:如果有“盐”,就有 30% 的概率加“糖”。
    • 问题: 它太死板了。它不知道“盐”和“糖”在特定情况下(比如做甜点时)应该一起出现,但在做咸菜时就不该一起出现。它缺乏对上下文的敏感度。

2. ExplainFuzz 是怎么做的?(核心魔法)

ExplainFuzz 引入了一个聪明的“概率电路”(Probabilistic Circuits, PCs)作为大脑。我们可以把它想象成一个**“拥有超级记忆和逻辑推理能力的智能主厨助手”**。

它的工作流程分为三步:

第一步:学习(编译与训练)

  • 做法: 助手先阅读一本“经典菜谱书”(现有的测试数据),同时手里拿着一本“语法字典”(语法规则)。
  • 比喻: 它不只是死记硬背菜谱,而是学会了**“为什么”**。比如,它发现:“哦,原来只要主菜里有‘鱼’,后面大概率会跟‘姜’和‘葱’,而且‘姜’和‘葱’的比例是固定的。”
  • 关键点: 它把语法规则和真实数据的学习结合在了一起,既懂语法,又懂现实世界的规律。

第二步:解释(可解释性)

  • 做法: 在生成新菜谱前,你可以问它问题。
  • 比喻: 你可以问助手:“如果我想做一道带‘辣’味的菜,出现‘辣椒’的概率是多少?”或者“如果我已经放了‘鱼’,那么放‘姜’的概率会增加吗?”
  • 优势: 以前的工具是黑盒,你不知道它为什么生成这个数据。ExplainFuzz 能让你看清它生成数据的逻辑,就像看得到它的思考过程一样。

第三步:定向生成(约束条件)

  • 做法: 这是它最厉害的地方。你可以给它下达具体的“约束指令”。
  • 比喻: 你可以对助手说:“帮我生成 100 道必须包含‘鱼’和‘辣椒’,但绝对不能有‘糖’的菜。”
  • 优势: 以前的工具很难精准控制。如果我想专门测试“带鱼”的情况,老方法可能得生成一万道菜才能碰巧遇到几道。但 ExplainFuzz 可以直接锁定这个条件,高效地生成大量符合特定要求的测试数据。

3. 效果如何?(实战表现)

作者在两个领域(SQL 数据库查询和 XML 数据格式)做了测试,结果非常惊人:

  • 更真实、更像人写的: 它生成的数据比以前的方法更连贯,更像真实的用户操作(困惑度更低)。
  • 发现 Bug 的能力更强:
    • SQL 测试中,它把发现 Bug 的成功率从 35% 提升到了 63%
    • XML 测试中,它更是从 10% 飙升到了 100%
    • 比喻: 以前的方法像是在大海里随便撒网,偶尔能捞到一条鱼(Bug);ExplainFuzz 像是拿着声呐,精准定位鱼群,然后一网打尽。
  • 多样性更高: 它不仅能找到 Bug,还能找到更多种不同方式来触发同一个 Bug。这意味着它能更全面地测试软件的弱点。

总结

ExplainFuzz 就像是给软件测试领域装上了一套**“带导航和说明书的自动驾驶系统”**。

  • 它不像老式方法那样盲目乱撞。
  • 它不像大模型那样让人摸不着头脑。
  • 懂语法(保证数据合法),懂概率(模仿真实数据分布),懂逻辑(能解释为什么这么生成),还能听指挥(按你的要求生成特定数据)。

最终,它帮助程序员用更少的时间、更聪明的方法,发现更多、更深层次的软件漏洞,让软件变得更安全、更可靠。

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

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

试用 Digest →