← 最新论文
🤖 machine learning

Verification Modulo Tested Library Contracts

该论文提出了一种名为“基于测试库契约的验证”的新方法,通过结合反例引导学习框架、约束求解器与测试引擎,自动合成能够证明客户端程序正确性且通过测试的模块化或上下文契约,并实现了工具 Vmtlc 在大型库调用场景中的有效性验证。

原作者: Abhishek Uppar, Omar Muhammad, Sumanth Prabhu, Deepak D'Souza, Madhusudan P, Adithya Murali

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

原作者: Abhishek Uppar, Omar Muhammad, Sumanth Prabhu, Deepak D'Souza, Madhusudan P, Adithya Murali

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

这篇文章介绍了一种名为 “基于测试的库合同验证” (Verification Modulo Tested Library Contracts) 的新方法,旨在解决一个让程序员和软件验证专家头疼的大问题:如何自动证明使用复杂大型库的小程序是安全的?

为了让你轻松理解,我们可以把软件开发想象成 “开一家餐厅”

1. 核心难题:大厨(库)太复杂,小老板(客户端)很焦虑

  • 场景:你是一家小餐厅的老板(客户端程序),你想做一道菜。你不需要自己种菜、养猪,你只需要从大型中央厨房库 Library)进货。中央厨房里有成千上万种复杂的食材处理机器(库函数)。
  • 传统验证的困境
    • 以前,为了证明你的餐厅绝对安全(没有毒),你需要完全验证中央厨房里的每一台机器。你需要给每台机器写一份厚厚的说明书(形式化合同/证明),证明它无论在任何情况下(比如有人往机器里扔石头、或者机器内部零件老化)都能正常工作。
    • 问题:中央厨房太大了,机器太复杂了,写说明书和证明的过程比开餐厅还难,甚至根本不可能完成。
  • 目前的妥协
    • 既然无法完全证明,我们通常只靠测试。让机器跑几百次,看看有没有坏。但这不够严谨,万一有个极其罕见的故障没测出来呢?

2. 本文的妙招: “合同 + 测试” 的混合模式

作者提出了一种聪明的折中方案:“基于测试的库合同验证” (VMTLC)

  • 核心思想
    1. 自动写合同:我们不再要求人工去写完美的说明书。相反,我们让计算机自动为中央厨房的机器生成一份**“合同”**(比如:“如果你给我土豆,我保证给你土豆泥”)。
    2. 严格测试合同:我们不验证机器内部原理,而是让一个**“疯狂测试员”**(测试引擎)拿着这份合同,拼命去折磨机器。如果机器在测试中违反了合同,测试员就会报告。
    3. 双重保险:如果机器通过了所有测试,且你的餐厅逻辑(客户端)基于这份合同能证明是安全的,那么我们就认为你的餐厅是安全的。

比喻
这就好比你雇佣了一个**“合同验证员”**。他不去检查厨房的电路图纸(太复杂),而是拿着合同去厨房试菜。如果厨师(库)说“我保证给你热菜”,验证员就不断试吃,只要没吃到冷菜,他就盖章通过。然后,你(客户端)拿着这个盖章的合同,就可以放心地告诉顾客:“我的菜绝对没问题”。

3. 两大创新点

A. 自动学习(AI 与数学的结合)

计算机怎么知道合同该写什么?

  • 猜错 - 修正循环:系统先猜一个合同,然后让“疯狂测试员”去试。
    • 如果测试员发现:“嘿!你合同说给土豆泥,结果给了土豆块!”(这就是反例)。
    • 系统就根据这个错误,修正合同,让它更准确。
  • ICE 学习算法:这是一种特殊的“学习算法”,它像学生一样,通过不断的“正例”(成功的测试)和“反例”(失败的测试)来修正自己的理解,直到写出一个既能让餐厅逻辑成立,又能骗过(或者说通过)测试员的完美合同。
  • LLM 的加入:作者还尝试让大语言模型(AI) 来帮忙猜合同。AI 很擅长理解自然语言描述,能猜出“插入后列表变长”这种常识,大大加快了猜合同的速度。

B. “情境合同” (Contextual Contracts) —— 最精彩的比喻

这是本文最大的亮点。

  • 传统合同(通用合同)

    • 要求:无论谁来用,无论什么状态,机器都必须遵守。
    • 例子: “无论谁把什么数字放进集合,集合里的最小值必须大于 0。”
    • 缺点:太难了!因为要覆盖所有不可能的情况(比如有人故意放负数)。
  • 情境合同(Contextual Contracts)

    • 要求:只在你(客户端)的使用场景下遵守即可。
    • 例子:你的餐厅规定“只允许放正数进集合”。那么合同就可以简化为:“如果你(餐厅)只放正数进来,我保证取出来的也是正数。”
    • 比喻
      • 通用合同就像要求一把万能钥匙能开世界上所有的锁,这太难了。
      • 情境合同就像一把专用钥匙,它只需要能开你家门(你的程序)的锁就行。虽然它开不了邻居家的锁,但对你来说,它既好用又容易制造。
    • 优势:因为限制条件变少了(只考虑你的用法),计算机更容易自动合成出这种合同,而且合同本身更简单。

4. 工具与效果:Dualis

作者开发了一个叫 Dualis 的工具。

  • 它像一个**“智能中介”**,一边指挥数学 solver(解题器)去推导逻辑,一边指挥测试员(Fuzzing 工具)去疯狂测试。
  • 实验结果:他们在很多真实的开源库(如 Facebook 和 Google 用的库)上测试。结果发现,传统的自动验证工具对这些大库完全无能为力(超时或报错),而 Dualis 成功地为许多复杂场景找到了“合同”,并证明了客户端的正确性。

5. 总结:这意味着什么?

这篇文章告诉我们,在软件验证领域,我们不需要死磕“完美证明”。

  • 以前:要么完全证明(太难,做不到),要么只测试(不够严谨)。
  • 现在:我们可以**“部分证明 + 部分测试”**。
    • 对于小客户(客户端程序),我们进行严格的逻辑证明。
    • 对于大供应商(库),我们生成自动合同,并用强力测试来“担保”这些合同。

一句话总结
这就好比我们不再试图证明“所有汽车在任何极端天气下都绝对安全”(这太难了),而是通过自动生成的规则和严格的碰撞测试,证明“在正常驾驶习惯下,这辆车是安全的”。这让软件验证变得更实用、更 scalable(可扩展),让大型复杂软件的安全保障成为可能。

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

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

试用 Digest →