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

ラッパーの記述

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

ランタイム・ライブラリー関数の独自のラッパーを記述することができます。通常、1 つまたは複数のポインターチェッカーの組込み関数を使用します。

__chkp_make_bounds を使用する割り当てラッパーの例

extern void *wrap_malloc(size_t bytes) {
    void* ppp;
    ppp = malloc(bytes);
    if (ppp) { ppp = (void*)__chkp_make_bounds(ppp, bytes);
    } else { ppp = (void*)0;}
    return ppp;
}

次のラッパーの例は、C ランタイムルーチンが書き込みを行う最初と最後のアドレスへ書き込みを実行することにより渡されるポインターの有効性をチェックします。C ランタイム・ライブラリー・コールの処理は最適化されていますが、必要に応じて、範囲外イベントが発生します。

ポインターチェッカーの組込み関数を使用せずにチェックを行う例

extern void *wrap_memset(void *dst, int c, size_t size) {
    if (size > 0) {
      *(char *)dst = c;          // 最初のアドレスに書き込みます
      *((char*)dst+size-1) = c;  // 最後のアドレスに書き込みます
      (void)memset(dst, c, size);
    }
    return dst;
}

また、ポインターに関連付けられている範囲を比較することで直接チェックすることもできます。その場合、最初に範囲が適切であることを確認する必要があります。これには、__chkp_upper_bound 組込み関数と __chkp_lower_bound 組込み関数を使用できます。

上限および下限組込み関数の例

extern void *wrap_memset(void *dst, int c, size_t size) {
  if (size > 0) {
    char *ub = __chkp_upper_bound(&dst);
    if ((intptr_t)ub != (intptr_t)-1) {
      char *lb = __chkp_lower_bound(&dst);
      char *max = (char*)dst+size-1;
        if (dst < lb)
           *(char*)dst = c;  // 範囲違反が発生します
        if (max > ub)
           *(char*)max = c;  // 範囲違反が発生します
      }
      (void)memset(dst, c, size);
    }
    return dst;
}