RTC はエラーレポートの数や種類を限定するよう、エラーの抑制機能を備えています。エラーが発生してもそれが抑制されている場合は、エラーは無視され、報告されずにプログラムは継続します。
エラーは suppress コマンド (「suppress コマンド」を参照) で抑止できます。
エラー抑止を取り消すには、unsuppress コマンド (「unsuppress コマンド」を参照) を使用します。
抑止機能は同じデバッグ節内の run コマンドの実行期間中は有効ですが、debug コマンドを実行すると無効になります。
どのエラーを抑止するかを指定する必要があります。次のように、プログラムのどの部分に抑制を適用するかを指定できます。
オプション |
内容の説明 |
---|---|
大域 |
スコープが指定されていないと全体のスコープが対象になり、すべてのプログラムに適用されます。 |
ロードオブジェクト |
共有ライブラリなど、すべてのロードオブジェクトが対象になります。 |
ファイル |
特定のファイルのすべての関数が対象になります。 |
関数 |
特定の関数が対象になります。 |
行 |
特定のソース行が対象になります。 |
アドレス |
特定のアドレスが対象になります。 |
デフォルトで RTC を実行すると、最新のエラーで同じエラーが繰り返し報告されることがなくなります。この機能は、dbx 環境変数 rtc_auto_suppress で制御します。rtc_auto_suppress が on のとき (デフォルト)、特定箇所の特定エラーは最初の発生時にだけ報告され、そのあと同じエラーが同じ場所で発生しても報告が繰り返されることはありません。最新エラーを抑止すると、繰り返し実行するループに 1 つのエラーがあっても、それが何度も報告されることがなく、便利です。
dbx 環境変数 rtc_error_limit では、報告されるエラーの回数を制限します。エラー制限は、アクセスエラーとリークエラーに別々に設定します。たとえば、エラー制限を 5 に設定すると、プログラムの終了時のリークレポートと、showleaks コマンドの実行ごとに、アクセスエラーとリークエラーがそれぞれ最高で 5 回報告されます。デフォルトは 1000 です。
次の例では、main.cc はファイル名、foo と bar は関数を示し、a.out は実行可能ファイルの名前を示します。
割り当てが関数 foo で起こったメモリーリークは報告しません。
suppress mel in foo |
libc.so.1 から割り当てられた使用中のブロック報告を抑止します。
suppress biu in libc.so.1 |
a.out の非初期化機能からの読み取りを抑止します。
suppress rui in a.out |
ファイル main.cc の非割り当てメモリーからの読み取りを報告しません。
suppress rua in main.cc |
main.cc の行番号 10 での重複解放を抑止します。
suppress duf at main.cc:10 |
関数 bar のすべてのエラー報告を抑止します。
suppress all in bar |
詳細については、「suppress コマンド」を参照してください。
RTC では、-g オプション (記号) を指定してコンパイルを行わなくてもすべてのエラーを検出できます。しかし、非初期化メモリーからの読み取りなど、正確さを保証するのに 記号 (-g) 情報が必要な特定のエラーもあります。このため、a.out の rui や共有ライブラリの rui、aib、air など特定のエラーは、記号情報が取得できない場合は、デフォルトで抑制されます。この動作は、-d オプション (suppress コマンドおよび unsuppress コマンド) を使用することで変更できます。
たとえば、次を実行すると、RTC は記号情報が存在しない (-g オプションを指定しないでコンパイルした) コードについて「非初期化メモリーからの読み取り (rui)」を抑制しません。
unsuppress -d rui |
詳細については、「unsuppress コマンド」を参照してください。
プログラムが大きい場合、エラーの数もそれに従って多くなることが予想されます。このような場合は、このような場合は、suppress コマンドを使用することにより、エラーレポートの数を管理しやすい大きさまで抑制し、一度で修正するエラーを制限します。
たとえば、一度で検出するエラーをタイプによって制限できます。一般的によくあるエラーのタイプは rui、rua、wua に関連したもので、この順序で検出されます。rui エラーはそれほど致命的なエラーではなく、このエラーが検出されてもたいていの場合プログラムは問題なく実行終了します。それに比べて rua と wua エラーは不正なメモリーアドレスにアクセスし、ある種のコーディングエラーを引き起こすため、問題は深刻です。
まず rui と rua エラーを抑制し、wua エラーをすべて修正したあと、もう一度プログラムを実行します。次に rui エラーだけを抑制し、rua エラーをすべて修正したあと、もう一度プログラムを実行します。さらにエラーの抑制をせずに、すべての rui エラーを修正します。最後にプログラムを実行し、エラーがすべて修正されたことを確認してください。
最新のエラー報告を抑止するには、「suppress -last」を実行します。