Hasty Briefsbeta

双语

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版本中修复,解决方案是确保栈指针调整操作的原子性。
  • 此次调查凸显了大规模场景下调试罕见竞态条件的挑战,以及理解底层运行时行为的重要性。