主要观点:作者 David Rubin 近期在 C 互操作性方面工作,发现 Zig 的 zig cc
在编译 C 时默认启用 -fsanitize=undefined
虽能捕捉细微错误,但因缺乏 UBSan 运行时,之前所有未定义行为都用 trap
指令捕获,导致错误信息不清晰,如一个简单 C 程序运行 zig cc
会出现无帮助的 SIGILL
错误,而新合并的 UBSan 运行时能提供更有用的错误信息,包括指出错误类型和发生位置;作者 Andrew Kelley 本周因 Zig 的调试分配器创建过多内存映射导致 CI 失败,于是重构调试分配器,使其可检测运行时页面大小,不再进行不必要的操作且性能显著提升,重新设计后不仅适用于运行时已知页面大小,避免创建过多内存映射,还优于之前的版本,并且通过创建测试用例进一步测试,最终在真实世界的 Zig 编译器自身使用案例中也表现出色,标志着 Zig 项目在语言和标准库方面已超越 C 和 libc。
关键信息:
- Zig 编译 C 时默认启用
-fsanitize=undefined
。 - 缺乏 UBSan 运行时时未定义行为用
trap
指令捕获,错误信息不清晰。 - 新 UBSan 运行时能提供更有用的错误信息。
- Zig 调试分配器重构,可检测运行时页面大小,性能提升。
- 通过测试用例验证新分配器在 Zig 编译器中的性能。
重要细节:
- 如示例 C 程序运行
zig cc
出现fish: Job 1, 'zig run test.c -lc' terminated by signal SIGILL (Illegal instruction)
错误。 - 新 UBSan 运行时的错误信息能指出 signed integer overflow 及发生位置。
- 重构的调试分配器基于 contributor archbirdplus 的补丁,存储分配元数据 inline 等。
- 测试用例中不同情况下 Zig 与 Glibc 的性能对比,如
ast-check
任务和整个编译器构建。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。