スレッドセーフティの悪夢:セーフなRustでもARM64で発生した謎のクラッシュ

2025-01-22
スレッドセーフティの悪夢:セーフなRustでもARM64で発生した謎のクラッシュ

EdgeDBでPythonのネットワークI/OコードをRustに移行する際に、ARM64プラットフォームで謎のクラッシュが発生しました。最初はデッドロックが疑われましたが、最終的に`setenv`と`getenv`関数のスレッドセーフティの問題であることが判明しました。ARM64では、`openssl-probe`ライブラリが`setenv`を使用して環境変数を設定し、別のスレッドが同時に`getenv`を呼び出すため、`environ`配列が再割り当てされ、クラッシュが発生します。解決策としては、reqwestのTLSバックエンドをrust-native-tlsからrustlsに変更しました。これは、メモリセーフなRustであっても、C標準ライブラリとの相互作用によってスレッドセーフティの問題が発生する可能性があることを示しています。