We found a bug in Go's ARM64 compiler
7 months ago
- #arm64
- #race-condition
- #Go
- Cloudflare发现Go语言arm64编译器存在一个bug,该bug会因大规模并发导致生成的代码出现竞态条件。
- 最初在arm64机器上观察到零星panic现象,经分析发现与栈展开过程中的栈损坏有关。
- 该问题最初与recovered panic及一个历史Go issue (#73259)相关联,临时解决方案是避免使用panic/recover进行错误处理。
- 随后出现更高频率的致命panic且无明确触发条件,促使团队展开深入调查。
- 最终识别出两类bug:无效内存访问导致的崩溃,以及栈展开期间触发的显式致命错误。
- 根本原因被追溯到Go的arm64编译器中栈指针拆分调整期间的异步抢占问题,这导致栈展开时出现无效栈状态。
- 团队创建了最小化复现代码,确认这是运行时问题而非Cloudflare环境特有。
- 该bug已在Go 1.23.12、1.24.6和1.25.0版本中修复,解决方案是确保栈指针调整操作的原子性。
- 此次调查凸显了大规模场景下调试罕见竞态条件的挑战,以及理解底层运行时行为的重要性。