インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
ポインターチェッカーは、macOS* システムではサポートされていません。
ダングリング・ポインターのチェックまたはヒープが有効な場合、コンパイラーは C ランタイム関数 free() と C++ delete 演算子のラッパーを使用します。これらのラッパーは解放されるブロックを指すすべてのポインターを特定して、ポインターへのアクセスが範囲違反になるポインターの範囲を変更します。これらのダングリング・ポインターの範囲は、実際には次のように設定されます。
lower_bound(p) = 2;
upper_bound(p) = 0;
プログラムがこれらの範囲で範囲違反となる場合、ダングリング・ポインターによる参照が原因です。
ダングリング・ポインターのチェックがスタックで有効な場合、コンパイラーは関数ローカルを指すすべてのポインターを特定して、関数終了の直前に上記のヒープポインターと同じ方法でポインターの範囲を変更します。
カスタム・メモリー・アロケーターを使用している場合、ダングリング・ポインターのチェックを有効にすることができます。カスタム・メモリー・アロケーターの free() 関数で、ポインター・チェッカー・ランタイム・コードの次の関数を呼び出します。
void __chkp_invalidate_dangling(void *ptr, size_t size);
この関数は、chkp.h ファイルで宣言されています。カスタム呼び出しインターフェイスを使用するため、この関数を使用するにはヘッダーファイルをインクルードする必要があります。
例 |
---|
#include <chkp.h> void my_free(void *ptr) { size_t size = my_get_size(ptr); // free を行う __chkp_invalidate_dangling(ptr, size); } |
C++ の delete 演算子をオーバーライドする関数を使用してダングリング・ポインターのチェックを有効にすることもできます。