とても興味深い。Goのツールチェーンには(デフォルトではオフの)テレメトリシステムがあるんだ。Go 1.23では、runtime.SetCrashOutput関数を追加して、実行中のゴルーチンのクラッシュに関するスタックトレースを含むフィールドレポートを集めるのに使った。goplsでそれを有効にしてから1年以上経つけど、何百ものバグを発見したよ。テレメトリを有効にしているユーザーは約1000人に1人だけだけど、それでもクラッシュに関する貴重な情報源になっている。ほとんどの場合、問題を再現するテストケースを簡単に再構築できて、バグは1時間以内に修正される。こうやって何十ものバグを修正してきた。原因が明らかでない場合は、if文やアサーションを追加してクラッシュを「洗練」させて、次のリリース後にスタックトレースから実行状態に関する追加情報を得るようにしている。ただ、説明できないフィールドレポートがいつも残っていて、壊れたスタックポインタや、壊れたgレジスタ(現在のゴルーチンへのスレッドローカルポインタ)、nilチェックを通過したポインタをデリファレンスしてパニックになることがあった。これらはすべてメモリの破損を示している。理論的には、unsafeを乱用したりデータレースがあれば何でも起こり得るけど、実行可能ファイル内のunsafeの使用をすべて監査した結果、安全だと確信している。データレースの不在を証明するのは難しいけど、通常はどの変数が壊れるかに何らかの局所性が見られるが、ここではそうではなかった。場合によっては、メモリ以外の命令(例えば、MOV ZR, R1)でクラッシュが発生することもあって、これは誤実行を示唆している。CPUの故障か、テレメトリの記録のバグかもしれない。プログラマーとして、自分のコードのミスをコンパイラやランタイムのせいにしてしまったことが何度もあったから、今回は基盤を疑う自信を持つまでに時間がかかった。でも最近、ちょっと計算してみたら(https://github.com/golang/go/issues/71425#issuecomment-39685...)、説明できないフィールドレポートが驚くほど多いこと、つまり週に約10件がユーザーの間で発生していることは、故障したハードウェアの範囲内に収まると結論付けた。特に、ユーザーの大半がラップトップを使っていて、パリティメモリがないからね。確定的な確認が欲しいけど、Firefoxチームがクラッシュ報告ソフトウェアでメモリに対してどんなテストを行っているのか気になる。