私自身のプロジェクト (Windows 上) でこれを回避するために、VirtualAlloc および VirtualFree と呼ばれる独自のメモリ アロケータを作成しました。リクエストごとに余分なページを割り当て、最後のページのすぐ左側に配置しVirtualProtect、最後のページにアクセスするたびに例外を生成していました。これにより、読み取りだけでも領域外アクセスがその場で検出されました。
免責事項: このアイデアを最初に思いついたのは決して私ではありません。
たとえば、ページが 4096 バイトでnew int[1]呼び出された場合、アロケータは次のようになります。
- 8192 バイトを割り当てます (4 バイトが必要で、これは 1 ページであり、追加のガード ページにより合計 2 ページになります)
- 最後のページにアクセス不可のマークを付ける
- 返すアドレスを決定します (最後に割り当てられたページは 4096 から始まります... 4096 - 2 = 4092)
次のコード:
main() {
int *array = new int[10];
return array[10];
}
その場でアクセス違反を発生させます。
割り当ての左側(つまり、array[-1])を超えたアクセスを検出する (コンパイル時) オプションもありましたが、この種のエラーはめったにないように思えたので、このオプションは使用しませんでした。