インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
ポインターチェッカーは範囲外のアクセスがないかポインターによる間接アクセスをチェックします。
ポインターの範囲をチェックするには、/Qcheck-pointers:rw (Windows*) または -check-pointers=rw (Linux*) コンパイラー・オプションを指定してモジュールをコンパイルします。
/Qcheck-pointers:write (Windows*) または -check-pointers=write (Linux*) のように、write 引数を指定してポインターの範囲をチェックすることもできます。 この場合は、書き込み操作のポインターの範囲のみチェックされます。
malloc() 関数を使用して要素数 10 の配列を作成し、各配列要素に文字を書き込むケースについて考えます。
char *buf = malloc(10); for (int i=0; i<=10; i++) { buf[i] = ‘A’ + i; }
配列の要素数は 10 ですが、ループは 11 回繰り返されています。11 回目の繰り返しで、関数は割り当てられたメモリーの外部にある配列の 11 番目の要素に文字を書き込みます。範囲のチェック対象が読み取り/書き込み操作か、書き込み操作のみかにかかわらず、ポインターチェッカーは範囲外エラーをレポートします。静的に割り当てられたバッファーの場合でも、ポインターチェッカーはエラーをレポートします。
次のコードについて考えてみます。
fprintf(stderr, "buf[%d]=%d\n",i,buf[i]);
buf[i] への参照は読み取り (ロード) 操作です。 そのため、範囲のチェック対象を書き込み操作のみにした場合、範囲外エラーはレポートされません。