インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

ダングリング・ポインターのチェック

ポインターチェッカーは、macOS* システムではサポートされていません。

ダングリング・ポインターのチェックまたはヒープが有効な場合、コンパイラーは C ランタイム関数 free() と C++ delete 演算子のラッパーを使用します。これらのラッパーは解放されるブロックを指すすべてのポインターを特定して、ポインターへのアクセスが範囲違反になるポインターの範囲を変更します。これらのダングリング・ポインターの範囲は、実際には次のように設定されます。

プログラムがこれらの範囲で範囲違反となる場合、ダングリング・ポインターによる参照が原因です。

ダングリング・ポインターのチェックがスタックで有効な場合、コンパイラーは関数ローカルを指すすべてのポインターを特定して、関数終了の直前に上記のヒープポインターと同じ方法でポインターの範囲を変更します。

カスタム・メモリー・アロケーターを使用している場合、ダングリング・ポインターのチェックを有効にすることができます。カスタム・メモリー・アロケーターの 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 演算子をオーバーライドする関数を使用してダングリング・ポインターのチェックを有効にすることもできます。

関連情報