打开网易新闻 查看精彩图片

AI生成代码的速度正在突破人类审阅的极限。去年有报道称,一个表面完整的AI生成应用因认证、访问控制和数据库权限存在严重缺陷,导致数万名用户记录泄露——系统"能跑"和"可信"之间,隔着一道看不见的鸿沟。

测试的盲区:为什么fuzzing不够用了

测试的盲区:为什么fuzzing不够用了

传统测试和模糊测试(fuzzing,一种通过随机输入发现漏洞的技术)依赖采样和覆盖率。它们擅长回答"这个输入会不会出问题",却难以回答"这个程序是否始终满足关键属性"。

Joshua Bloch在2006年揭露过一个经典案例:Java标准库的二分查找实现存在整数溢出漏洞,该缺陷潜伏近十年才被发现。代码看起来正确,运行也通过测试,但边界条件下的数学约束从未被严格验证。

形式化证明(formal proof,用数学方法严格证明程序正确性的技术)提供了一条更清晰的路线:直接描述程序必须满足的属性,自动检查实现是否真正满足这些属性。

MoonBit 0.9的核心突破,是将这套能力完整构建为"AI协作原生"的工具链。它帮助AI自动构造非平凡证明、生成规约、验证实现是否满足规约——这是该领域首次实现此类突破。

二分查找的完整验证:代码即契约

二分查找的完整验证:代码即契约

以二分查找为例。左侧是函数实现,标注了契约和循环不变式;右侧是谓词定义文件;底部终端显示验证完全通过。

函数开头的proof_requires(sorted(xs))和proof_ensures(binary_search_ok(xs, key, result))构成函数与外界的契约。调用方承诺输入数组已排序;函数承诺返回值正确——若找到结果,该结果确实是目标元素;若返回空,则目标值确实不存在于数组中。

这些不是注释或文档,而是由机器严格检查的约束。

loop_invariant标注了循环不变式,描述每次迭代前后保持为真的条件。assert语句标记程序中的关键断言。proof_check!()指令要求验证器检查所有标注的约束是否成立。

右侧的.mbtp文件定义了排序、查找正确性等谓词。这些谓词使用MoonBit的子集编写,可被编译为SMT(Satisfiability Modulo Theories,可满足性模理论,一种自动定理证明技术)求解器接受的格式。

整个验证流程完全自动化。开发者只需标注关键约束,验证器自动完成剩余工作。

AI协作设计:让机器证明机器生成的代码

AI协作设计:让机器证明机器生成的代码

MoonBit 0.9的形式化验证架构针对AI协作做了专门优化。证明构造、规约生成、验证执行三个环节都被设计为可由AI自动完成。

关键设计选择包括:使用SMT求解器处理大量自动化推理,将复杂证明分解为可独立验证的引理,以及提供清晰的错误反馈帮助AI迭代修正。

这意味着AI生成的代码可以被AI自动验证——形成"生成-验证"的闭环。

相比依赖人类编写测试用例的传统流程,这种机制理论上可以覆盖更完整的属性空间。只要底层假设成立,证明过程本身也可以被AI大规模生成。

从"能跑"到"可信"还有多远

从"能跑"到"可信"还有多远

形式化验证并非新鲜事物,但此前多用于航空航天、金融基础设施等高安全领域,工具链复杂、学习曲线陡峭。MoonBit 0.9的尝试在于降低门槛,将其嵌入日常开发工作流。

当前版本已支持函数契约、循环不变式、断言等核心功能。验证失败时,工具会给出具体的不满足约束和反例路径,而非笼统的错误提示。

一个尚未完全解决的问题是:谁来定义"正确"的规约?形式化验证只能保证实现满足规约,若规约本身遗漏关键安全属性,验证通过的代码仍可能存在漏洞。

MoonBit团队的做法是将规约编写也纳入AI协作范围——让AI基于代码上下文自动生成候选规约,再由开发者审核确认。这种"AI生成+人类把关"的混合模式,可能是规模化应用的可行路径。

去年那起数据泄露事件的根源,正是关键约束"既未被清晰表达,也未被系统验证"。MoonBit 0.9提供的工具链,让"表达约束"和"验证约束"成为开发流程的标准环节,而非事后补救。

当AI生成代码的速度继续提升,"每行代码都可被证明其关键属性"或许将从理想变为底线要求。届时,缺乏形式化验证能力的语言和环境,是否还能进入生产环境?