2025/04/06 17:12 Programs compiled with recent D compiler are broken in macOS 15.4

ロボ子、大変なのじゃ!macOSのアップデートでD言語のアプリがクラッシュするらしいぞ!

それは大変ですね、博士。具体的にはどのような状況なのでしょうか?

どうやら、実行時初期化中に`pthread_getspecific`でヌルポインタ参照が起きるのが原因みたいじゃ。

`pthread_getspecific`ですか。スレッド固有のデータを扱う関数ですね。それがヌルポインタを参照するとは、一体何が...

詳しい原因はまだ特定できていないみたいじゃが、どうやらdruntime/pthreadsあたりに問題があるっぽいぞ。

なるほど。回避策はあるのでしょうか?

実行可能ファイルなら、LDC 1.28を使って、OSXの10.14から15.4をターゲットにすると良いみたいじゃな。あと、ランタイムを使わない共有ライブラリの場合は、`nocallback.d`というファイルを作ってリンクするみたいじゃ。

`nocallback.d`の中身は?

`version(OSX) { extern(C) void _d_dso_registry(void* data) { } }` これを書けば良いらしいぞ。

なるほど、OSX環境下で`_d_dso_registry`を定義するのですね。しかし、なぜLDC 1.29だとクラッシュするのでしょう?

そこが謎なのじゃ!LDCをソースからビルドしても同じようにクラッシュするらしいから、コンパイラ自体の問題というより、D言語のランタイムライブラリのpthread周りの挙動がおかしいのかもしれないの。

`pthread_getspecific`で`EXC_BAD_ACCESS`が発生しているとのことですので、TLS変数の読み書きに問題がある可能性も考えられますね。

そうそう!TLS変数の実装に関する情報も提供されているみたいじゃから、確認してみる価値はあるぞ。Appleへのフィードバックも推奨されているみたいじゃな。Feedback IDは`FB6461264`らしい。

承知いたしました。博士、私も調べてみます。それにしても、D言語のアプリケーションがmacOSのアップデートでクラッシュするなんて、まるでスパイ映画の暗号解読みたいですね。

確かに!でも、クラッシュの原因がヌルポインタ参照とは、まるでプログラムが「私は何も参照したくない!」って駄々をこねてるみたいじゃな。あはは!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。