Go 런타임의 숨은 버그: 32비트 임베디드 시스템에서 5년 만에 발견
Hunting Down a Go Runtime Bug on 32-Bit Embedded Systems

고객의 32비트 ARM 임베디드 Linux 시스템에서 Go 애플리케이션이 간헐적으로 치명적인 netpoll 오류로 크래시되는 문제를 추적한 과정을 다룹니다. 원인은 Go 런타임의 netpoll 코드가 8바이트 epoll_event.data 필드에 원시 포인터와 태그된 포인터를 혼용하면서, 32비트 리틀 엔디언 시스템에서 fdseq 태그가 netpollEventFd 주소와 충돌하여 소켓 fd를 이벤트 fd로 오인한 것이었습니다. 이 버그는 Go 1.14(2020년)에서 도입되어 2026년에 수정되었으며, 장기 실행 프로그램에서만 수백만 개의 pollDesc 객체가 재활용된 후 발생합니다. 저자는 테스트 케이스와 수정 패치를 제공했고, 이 패치는 Go에 병합되었습니다.
이 버그는 2020년 Go 1.14에 들어왔고, 2025년 3월 첫 보고까지 발견되지 않았으며 2026년에야 수정되었습니다. 아마 Google 자체가 더 이상 32비트 Go 프로그램을 실행하지 않기 때문일 것입니다.