Xr0 是一个用于 C 语言的验证器,旨在消除多种顽固的未定义行为,包括释放后使用、重复释放、空指针解引用以及未初始化内存的使用。
它通过类似 C 的注解来验证代码。这些注解附加在每个可能不安全的函数上,表达其调用者安全使用该函数所需了解的信息。例如,为 alloc 函数添加的注解 [ return malloc(1); ] 表明调用者必须释放返回的内存。对于条件更复杂的情况,如 alloc_if 函数,注解 [ if (x) return malloc(1); ] 明确指出调用者仅在 x != 0 时需要进行释放。
Xr0 的核心思想在于防止那些通过多层函数调用悄然潜入的、非常微妙的安全漏洞。它通过将确保安全所需的所有信息分布到每一个函数调用中,使得任何细微的错误都难以隐藏。这相当于将程序每个部分的安全语义与其它所有部分“量子纠缠”在一起。
可以将其理解为一个能够适应程序结构需求、信息无比丰富的类型系统。开发者仍然需要自行确保代码安全,而 Xr0 的作用是检查开发者的工作成果。因此,Xr0 被比作“魔杖”而非“魔法师”,真正的魔力源于程序员本身。
Xr0 仍在开发中,目前仅验证 C89 标准的一个子集。其最主要的限制是尚未实现对循环和递归函数的验证,目前暂时通过公理化注解来弥补。计划中的 Xr0 1.0.0 版本将支持编写无未定义行为的 C 程序,但目前它已可用于验证程序的特定部分。Xr0 使用纯 C 编写,并且是开源项目。
若想了解 Xr0,最好的方式是亲自尝试。通过使用调试器并阅读教程可以理解其工作方式。更深入的内容可参考相关论文以及项目愿景和路线图。用户也可以通过 Discord 或邮件与开发团队交流。