RTC では、読み取り、書き込み、メモリー解放の各操作を監視することによって、プログラムがメモリーに正しくアクセスするかどうかを検査します。
プログラムは、さまざまな方法で間違ってメモリーを読み取ったり、メモリーに書き込んだりすることがあります。このようなエラーをメモリーアクセスエラーといいます。たとえば、ヒープブロックの free() 呼び出しを使用して、または関数がローカル変数にポインタを返したために、プログラムが参照するメモリーブロックの割り当てが解放されている可能性があります。アクセスエラーはプログラムでワイルドポインタの原因になり、間違った出力やセグメント不正など、プログラムの異常な動作を引き起こす可能性があります。メモリーアクセスエラーには、検出が非常に困難なものもあります。
RTC は、プログラムによって使用されているメモリーの各ブロックの情報を追跡するテーブルを管理します。プログラムがメモリー操作を行うと、RTC は関係するメモリーブロックの状態に対してその操作が有効かどうかを判断します。メモリーの状態として次のものがあります。
未割り当て (初期) 状態。メモリーは割り当てられていません。この状態のメモリーはプログラムが所有していないため、読み取り、書き込み、解放のすべての操作が無効です。
割り当て済み/未初期化。メモリーはプログラムに割り当てられていますが、初期化されていません。書き込み操作と解放操作は有効ですが、初期化されていないので読み取りは無効です。たとえば、関数に入るときに、スタック上にメモリーが割り当てられますが、初期化はされません。
読み取り専用。読み取りは有効ですが、書き込みと解放は無効です。
割り当て済み/初期化済み。割り当てられ、初期化されたメモリーに対しては、読み取り、書き込み、解放のすべての操作が有効です。
アクセスエラーを見つけるには、アクセス検査をオンにし、プログラムにアクセスエラーのリストを作成させるのが一番簡単な方法です。 RTC を使用してメモリーアクセスエラーを見つける方法は、コンパイラがプログラム中の構文エラーを見つける方法と似ています。いずれの場合でも、プログラム中のエラーが発生した位置と、その原因についてのメッセージとともにエラーのリストが生成され、リストの先頭から順に修正していかなければなりません。これは、あるエラーがほかのエラーと関連して連結されたような作用があるためです。連結の最初のエラーが先頭の原因となり、そのエラーを修正することにより、そのエラーから派生した他の問題も解決されることがあります。たとえば、初期化されていないメモリーの読み取りにより、不正なポインタが作成されるとします。すると、これが原因となって不正な読み取りと書き込みのエラーが発生し、それがまた原因となってさらに別の問題が発生するというようなことになる場合があります。
メモリーアクセスエラーを検出すると RTC は次の情報を出力します。
|
種類 |
エラーの種類。 |
|
アクセス |
試みられたアクセスの種類 (読み込みまたは書き込み)。 |
|
サイズ |
試みられたアクセスのサイズ。 |
|
アドレス |
試みられたアクセスのアドレス |
|
詳細 |
アドレスについてのさらに詳しい情報。たとえば、アドレスがスタックの近くに存在する場合、現在のスタックポインタからの相対位置が与えられます。アドレスが複数存在する場合、一番近いブロックのアドレス、サイズ、相対位置が与えられます。 |
|
スタック |
エラー時の呼び出しスタック (バッチモード)。 |
|
割り当て |
addr がヒープにある場合、最も近いヒープブロックの割り当てトレースが与えられます。 |
|
場所 |
エラーが発生した位置。行が特定できる場合には、ファイル名、行番号、関数が示されます。行番号が分からないときは関数とアドレスが示されます。 |
非初期化領域からの読み取り (rui):
4 バイト読み取り を アドレス 0xeffff794 で しようとしました
それは 100 バイト 現スタックポインタより上 です
変数は 'y' です。
現関数 :sub
41 x = y;
RTC は、以下のメモリーアクセスエラーを検出します。
非初期化メモリーからの読み取り ― Read from uninitialized memory (rui)
非割り当てメモリーからの読み取り ― Read from unallocated memory (rua)
非割り当てメモリーへの書き込み ― Write to unallocated memory (wua)
読み取り専用メモリーへの書き込み ― Write to read-only memory (wro)
境界整列を誤った読み取り ― Misaligned read (mar)
境界整列を誤った書き込み ― Misaligned write (maw)
重複解放 ― Duplicate free (duf)
不正解放 ― Bad free (baf)
境界整列を誤った解放 ― Misaligned free (maf)
メモリー不足 ― Out of memory (oom)
各エラーと例の詳細については、この章の「RTC エラー」の項を参照してください。