アクセス検査では、読み取り、書き込み、割り当て、解放の各操作をモニターすることによって、プログラムが正しくメモリーにアクセスしているかどうかをチェックします。
プログラムが誤ってメモリーの読み書きを行う状況にはさまざまなものがあります。これらはメモリーアクセスエラーと呼ばれます。たとえば、プログラムは、ヒープブロックに対する free() の呼び出しを使用して解放されたメモリーブロックを参照することがあります。または、関数が局所変数へのポインタを返すことがあり、そのポインタにアクセスするとエラーが発生します。アクセスエラーはプログラムでワイルドポインタの原因になり、間違った出力やセグメント不正など、プログラムの異常な動作を引き起こす可能性があります。ある種類のメモリーアクセスエラーは、見つけるのが非常に困難です。
RTC は、プログラムによって使用されているメモリーの各ブロックの情報を追跡するテーブルを管理します。プログラムがメモリー操作を行うと、RTC は関係するメモリーブロックの状態に対してその操作が有効かどうかを判断します。可能性のあるメモリーの状態は次のとおりです。
割り当てられていない、初期状態。メモリーは割り当てられていません。この状態のメモリーはプログラムが所有していないため、読み取り、書き込み、解放のすべての操作が無効です。
割り当てられているが、初期化されていない。メモリーはプログラムに割り当てられていますが、初期化されていません。書き込み操作と解放操作は有効ですが、初期化されていないので読み取りは無効です。たとえば、関数に入るときに、スタック上にメモリーが割り当てられますが、初期化はされません。
読み取り専用。読み取りは有効ですが、書き込みと解放は無効です。
割り当てられており、かつ初期化済み。割り当てられ、初期化されたメモリーに対しては、読み取り、書き込み、解放のすべての操作が有効です。
RTC を使用してメモリーアクセスエラーを見つける方法は、コンパイラがプログラム中の構文エラーを見つける方法と似ています。いずれの場合でも、プログラム中のエラーが発生した位置と、その原因についてのメッセージとともにエラーのリストが生成され、リストの先頭から順に修正していかなければなりません。これは、あるエラーがほかのエラーと関連して連結されたような作用があるためです。そのため、チェーン内の最初のエラーは「最初の原因」であり、そのエラーを修正すると以降のエラーの一部も修正される可能性があります。
たとえば、初期化されていないメモリーの読み取りにより、不正なポインタが作成されるとします。すると、これが原因となって不正な読み取りと書き込みのエラーが発生し、それがまた原因となってさらに別の問題が発生するというようなことになる場合があります。
実行時検査では、メモリーアクセスエラーに関する次の情報が提供されます。
エラーの種類。
試みられたアクセスの種類 (読み取りまたは書き込み)。
試みられたアクセスのサイズ。
試みられたアクセスのアドレス
リークしたブロックのサイズ
アドレスについてのさらに詳しい情報。たとえば、アドレスがスタックの近くに存在する場合、現在のスタックポインタからの相対位置が与えられ ます。アドレスが複数存在する場合、一番近いブロックのアドレス、サイズ、相対位置が与えられます。
エラー時の呼び出しスタック (バッチモード)。
addr がヒープにある場合、もっとも近いヒープブロックの割り当てトレースが与えられます。
エラーが発生した位置。行が特定できる場合には、ファイル名、行番号、関数が示されます。行番号がわからないときは関数とアドレスが示されます。
代表的なアクセスエラーは次のとおりです。
Read from uninitialized (rui): Attempting to read 4 bytes at address 0xefffee50 which is 96 bytes above the current stack pointer Variable is ”j’ Current function is rui 12 i = j;
rui – 非初期化メモリーからの読み取り (rui) エラーを参照
rua – 非割り当てメモリーからの読み取り (rua) エラーを参照
rob – 配列範囲外からの読み込み (rob) エラーを参照
wua – 非割り当てメモリーへの書き込み (wua) エラーを参照
wro – 読み取り専用メモリーへの書き込み (wro) エラーを参照
wob – 配列範囲外メモリーへの書き込み (wob) エラーを参照
mar – 境界整列を誤った読み取り (mar) エラーを参照
maw – 境界整列を誤った書き込み (maw) エラーを参照
duf – 重複解放 (duf) エラーを参照
baf – 不正解放 (baf) エラーを参照
maf – 境界整列を誤った解放 (maf) エラーを参照
oom – メモリー不足 (oom) エラーを参照