Author: h.mohri
この記事は、DAVID MILLINGTONによる10.2.3 C++ Hotfix for an issue with a 4KB or larger stack allocationの抄訳です。 |
10.2.3では、メソッド内のスタックに4KB以上を割り当てる fastcall呼び出し規約を使用するメソッドに影響を与える issueがあります。スタックの割り当てによって、 ‘this’ポインタに不正な値が格納される可能性があります。
これは次のように報告されました:
- RSP-20171
- RSP-20297 、RSP-20173 (duplicate reports)
CodeCentralからホットフィックスをダウンロードできます
技術情報
技術的な詳細に関しましては、“Stack Grows”すると、新しいページに増やす必要があり(4KBはWindows上のページのサイズ)定義すると発生します。コンパイラが4KB以上のスタック割り当てを認識すると、次のページが確実にコミットされるようにメソッドを呼び出します。
これを処理するRTLメソッドは、常に1つの_chkstkしか持たないので10.2.3では新しいバージョン_chkstk_noallocを導入しました。この新しい方法は、espレジスタが変更されないように確保します。そうでない場合、ユーザーアプリケーションは大丈夫ですがデバッガはConfusedする可能性があり、再帰メソッドであったと考えられます。しかし、この問題は10.2.3で修正されました。このホットフィックスでは、eaxレジスタが正しく復元されない問題などの関連を解決します。fastcallメソッドの場合、 ‘this’ポインタとして現れます。
古いRTLと新しいRTLを混在させると、この新しいメソッドに対して未解決の外部が発生するため、プロジェクトを再構築して10.2.3 RTLと再リンクするようにしてください。10.2.3にアップグレードし、このホットフィックスは、以前のリリースで問題だったいくつかのデバッグシナリオを解決し、非常に大きな割り当てを持つメソッドのメソッドパラメータやその他の項目のデバッグを有効にします。