ランタイム・ライブラリー関数の独自のラッパーを記述することができます。通常、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;
}