在 ABI 咖啡馆配对你的编译器 - Faultlore

这是一篇关于 ABI(应用二进制接口)兼容性测试工具 abi-cafe 的文章,主要内容如下:

  • 历史与动机:作者多次尝试撰写关于 ABI 相关的文章,最终因合适的动机而创作。abi-cafe 最初是在对 C 语言__int128类型的 ABI 问题感到困扰时创建,用于测试 Rust 与 C 编译器之间的 ABI 兼容性,后来还被用于发现 rustc 的 cranelift 代码生成后端的一个 bug。
  • ABI 的现状与问题:ABIs 往往未明确规定,不同编译器实现差异大,人们常需逆向工程,跨语言的 FFI 更是充满不确定性。虽然有一些规格,但往往与实现不符或过于模糊,且多是语言特定的。
  • abi-cafe 的工作原理:通过让双方用回调报告看到的值来确定值是否“正确”,以测试编译器之间的 ABI 兼容性。对于不同类型,如基本类型、复合类型(结构体)、标记联合(tagged unions)、非标记联合(untagged unions)以及各种特殊情况(如repr(transparent)Option优化等),都有相应的测试方法。
  • abi-cafe 2.0 的核心:kdl-script:abi-cafe 1.0 在处理标记联合时遇到困难,因此需要 abi-cafe 2.0,它采用更通用的框架 kdl-script 来处理类型系统和编译器相关细节。kdl-script 是一种类似 Rust 的编程语言,用于描述函数签名等,它有“pun types”特性,可以让不同语言/编译器以不同方式解释类型,虽然思考起来很复杂,但能实现复杂的类型兼容测试。

总之,文章深入探讨了 ABI 兼容性测试的问题和解决方案,以及 abi-cafe 和 kdl-script 的发展与应用。

阅读 9
0 条评论