実行時検査には、報告されるエラーの数や種類を制限するうえで高い柔軟性を提供する、強力なエラーの抑制機能が含まれています。エラーが発生してもそれが抑制されている場合は、エラーは無視され、報告されずにプログラムは継続します。
エラーの抑制は、unsuppress コマンドを使用して取り消すことができます。
抑止機能は同じデバッグ節内の run コマンドの実行期間中は有効ですが、debug コマンドを実行すると無効になります。
このセクションでは、使用可能な抑制のタイプについて説明します。
どのエラーを抑止するかを指定する必要があります。次のように、オプションは次のとおりです。
デフォルトであり、プログラム全体に適用されます。
ロードオブジェクト全体 (共有ライブラリなど) またはメインプログラムに適用されます。
特定のファイル内のすべての関数に適用されます。
特定の関数に適用されます。
特定のソース行に適用されます。
あるアドレスにある特定の命令に適用されます。
デフォルトでは、同じエラーの報告が繰り返されないようにするために、実行時検査では最新のエラーを抑制します。 この設定は、dbx 変数 rtc_auto_suppress によって制御されます。 rtc_auto_suppress が on のとき (デフォルト)、特定箇所の特定エラーは最初の発生時にだけ報告され、そのあと同じエラーが同じ場所で発生しても報告が繰り返されることはありません。この設定は、たとえば、何回も実行されるループでエラーが発生した場合に同じエラー報告の複数のコピーを避けるために役立ちます。
dbxenv 変数 rtc_error_limit を使用すると、報告されるエラーの数を制限できます。 エラー制限は、アクセスエラーとリークエラーに別々に設定します。たとえば、エラー上限が 5 に設定されている場合は、実行の最後に示されるリークレポートと、発行する各 showleaks コマンドの両方で、最大 5 つのアクセスエラーと 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 コマンドを参照してください。
実行時検査では、すべてのエラーを検出するために - g オプション (シンボリック) を使用してプログラムをコンパイルする必要はありません。ただし、特定のエラー (主に rui エラー) の正確性を保証するために、シンボリック情報が必要な場合もあります。このため、シンボリック情報が使用できない場合、特定のエラー (a.out では rui、共有ライブラリでは rui、aib、および air) はデフォルトで抑制されます。この動作は、suppress コマンドと unsuppress コマンドの -d オプションを使用して変更できます。
たとえば、次を実行すると、RTC は記号情報が存在しない (-g オプションを指定しないでコンパイルした) コードについて「非初期化メモリーからの読み取り (rui)」を抑制しません。
unsuppress -d rui
詳細については、unsuppress コマンドを参照してください。
プログラムが大きい場合、エラーの数もそれに従って多くなることが予想されます。段階的なアプローチをとることを検討してください。それには、suppress コマンドを使用して、報告されるエラーを管理可能な数に削減し、これらのエラーだけを修正します。そして、このサイクルを繰り返しします。 これにより、繰り返すたびに、抑制するエラーを少なくすることができます。
たとえば、一度で検出するエラーをタイプによって制限できます。通常検出されるもっとも一般的なエラーの種類は、rui、rua、および wua であり、通常はこの順序です。rui エラーは比較的軽度ですが、あとでより重大なエラーを引き起こす場合があります。これらのエラーが発生しても、プログラムはたいてい引き続き正しく機能します。rua エラーと wua エラーは、無効なメモリーアドレスへのアクセスまたはそれらのアドレスからのアクセスであり、また常にコーディングエラーを示すためより重大です。
まず rui と rua エラーを抑制し、発生する wua エラーをすべて修正したあと、rui エラーのみを抑制して、プログラムを再度実行します。発生する rua エラーをすべて修正したあと、エラーを抑制せずに、プログラムを再度実行します。すべての rui エラーを修正します。最後に、プログラムを最終的に実行して、エラーが残っていないことを確認します。
最新のエラー報告を抑止するには、「suppress -last」を実行します。