C++Builderでスレッド(std :: threadなど)を作成するアプリケーションをWindows 64-bit向けにビルドすると、一部のWin64マシンにおいてアクセス違反が発生するスレッドローカルストレージの問題を修正するパッチをリリースしました。
このパッチはQuality Portalで報告された次の問題を解決します。
RSP-27180 64-bit builds crash with threads
この問題はC/C++ RTLのアセンブリコード内でWin64 32バイトのshadow spaceを設定してTLS(スレッドローカルストレージ)データをクリーンアップする際に生じたエラーと、HeapFreeメソッドの呼び出しに対して末尾呼び出し最適化(tail-call optimization)を適用するコンパイラとの組み合わせにより発生します。
言い換えると、bcc64コンパイラによって最適化されたHeapFreeの呼び出し元で、shadow spaceを誤って設定するコードが適用されていたことによって、
異なるWindowsビルドに依存する一部のマシンでは、HeapFreeはshadow spaceを使用するため、TLSをクリーンアップする際にアクセス違反が発生しました。
このパッチでは、呼び出し元でshadow spaceを正しく設定し、アクセス違反が発生しなくなるように修正しております。
なお、このケースはbcc64コンパイラ固有の問題で、bcc32/bcc32cなどの32ビットコンパイラを利用してビルドしたアプリケーションに対しては、パッチの適用の有無によらず関わらず、特に影響はありません。
パッチはこちらから入手できます。
https://cc.embarcadero.com/item/30909
パッチの適用手順は、以下の通りです
- RAD Studioを終了します。
- RAD Studioのメインフォルダ(通常はC:\Program Files (x86)\Embarcadero\Studio\20.0)より以下のファイルをバックアップします。
・lib\win64\debug\c0d64.o
・lib\win64\debug\c0fmx64.o
・lib\win64\debug\c0pkg64.o
・lib\win64\debug\c0w64.o
・lib\win64\debug\c0x64.o
・lib\win64\release\c0d64.o
・lib\win64\release\c0fmx64.o
・lib\win64\release\c0pkg64.o
・lib\win64\release\c0w64.o
・lib\win64\release\c0x64.o
・source\cpprtl\Source\startup\c0nt64.nasm
・bin64\cc64260.dll
・bin64\cc64260.map
・bin64\cc64260mt.dll
・bin64\cc64260mt.map - ダウンロードした CB1033_TLS_Library_Patch.zip ファイルを解凍します。
- 展開されたファイルセットをRAD Studioのメインフォルダに上書きコピーします。
- RAD Studioを起動します。
※Delphi / C++Builder / RAD Studio 10.3.3 向けのパッチはリリース順に適用する必要があります。
RAD Studio / Delphi / C++Builder 10.3.3 パッチリスト
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition