コードアナライザのツールを使用して、3 種類までのデータを収集できます。
–xprevise コンパイラオプションを使用してバイナリを構築すると、コンパイラは静的エラーを自動的に抽出し、データをソースコードと同じディレクトリの binary-name.analyze ディレクトリの static サブディレクトリに書き込みます。コンパイラで検出される静的エラーの種類のリストについては、静的コードの問題を参照してください。
sample ディレクトリで、次のように入力してアプリケーションを構築します。
Oracle Solaris の場合:
$ cc -xprevise main.c previse*.c sample1.c sample2.c sample3.c
Oracle Linux の場合:
$ cc -xannotate -xprevise main.c previse*.c sample1.c sample2.c sample3.c
静的エラーデータが sample/a.out.analyze/static ディレクトリに書き込まれます。
コードアナライザ GUI を起動して結果を表示します。
$ code-analyzer a.out &
コードアナライザ GUI が開き、コンパイル時に見つかった静的コードの問題が「結果」タブに表示されます。「結果」タブの左上にあるテキストは、13 件の静的コードの問題が検出されたことを示しています。
タブでは、各問題について、問題の種類、問題が見つかったソースファイルのパス名、およびそのファイルの該当するソース行を強調表示したコードスニペットが表示されます。
最初の問題、「メモリーの二重解放」エラーの詳細を表示するには、エラーアイコン
をクリックします。
問題のスタックトレースが開き、エラーパスが表示されます。
スタックトレースを開くと、問題の右上隅に表示されているアイコンが
から、問題を確認したことを示す
に変わることがわかります。
同じエラーアイコンをクリックして、スタックトレースを閉じます。
「初期化されていないメモリーの読み取り」警告の 1 つの警告アイコン
をクリックして、スタックトレースを開きます。
この問題のエラーパスには、「メモリーの二重解放」問題のエラーパスよりもはるかに多くの関数呼び出しが含まれています。
最初の関数呼び出しをダブルクリックします。
ソースファイルが開き、その呼び出しが強調表示されます。エラーパスは、ソースコードの下の詳細ウィンドウに表示されます。
エラーパス内のその他の関数呼び出しをダブルクリックしていくと、エラーにつながったパスをコード内で追尾できます。
問題の説明の左側にある情報ボタン
をクリックして、UMR エラータイプに関する詳細情報を確認します。
コード例や考えられる原因などを含め、エラータイプの説明がオンラインヘルプブラウザに表示されます。
右上隅の X をクリックしてコードアナライザ GUI を閉じます。
静的データを収集したかどうかにかかわらず、アプリケーションをコンパイルし、計測機構を組み込み、実行して、動的メモリーアクセスデータを収集できます。discover で計測機構を組み込んでからアプリケーションを実行することによって検出される動的メモリーアクセスエラーのリストについては、動的メモリーアクセスの問題を参照してください。
sample ディレクトリで、サンプルアプリケーションを –g オプションで構築します。
このオプションではデバッグ情報が生成され、エラーおよび警告に関するソースコードおよび行番号情報をコードアナライザで表示できるようになります。
Oracle Solaris の場合:
$ cc -g main.c previse*.c sample1.c sample2.c sample3.c
Oracle Linux の場合:
$ cc -xannotate -g main.c previse*.c sample1.c sample2.c sample3.c
すでに計測機構の付いたバイナリに計測機構を組み込むことはできないため、カバレージデータの収集時に使用するバイナリのコピーを保存します。
$ cp a.out a.out.save
discover でバイナリに計測機構を組み込みます。
$ discover -a a.out
計測機構付きバイナリを実行して動的メモリーアクセスデータを収集します。
$ ./a.out
動的メモリーアクセスエラーデータが sample/a.out.analyze/dynamic ディレクトリに書き込まれます。
コードアナライザ GUI を起動して結果を表示します。
$ code-analyzer a.out &
「結果」タブに、静的な問題と動的メモリーの問題の両方が表示されます。問題の説明の背景色は、静的コードの問題 (褐色) または動的メモリーアクセスの問題 (淡い緑) のいずれであるかを示しています。
結果をフィルタリングして動的メモリーの問題だけを表示するには、「問題」タブで「動的」オプションを選択します。
「結果」タブに、中核となる 3 件の動的メモリーの問題だけが表示されます。
すべての動的メモリーの問題を表示するには、「問題」タブの上部にある「すべて」ラジオボタンを選択します。「結果」タブに、6 件の動的メモリーの問題が表示されます。
表示に追加された 3 件の問題を調べ、中核となる問題にどのように関連しているかを確認します。表示されている最初の問題の原因を修正すれば、2 番目と 3 番目の問題も解消される可能性があります。
最初の問題を調査している間、ほかの動的メモリーアクセスの問題を非表示にするには、各問題の「無視」ボタン
をクリックします。
エラーアイコンをクリックしてスタックトレースを表示し、最初の問題を調査します。
この問題の場合、スタックトレースには呼び出しスタックと割り当てスタックが含まれます。
スタック内の関数呼び出しをダブルクリックして、ソースファイル内の関連する行を表示します。
ソースファイルが開くと、ファイルの下の詳細ウィンドウにスタックトレースが表示されます。
右上隅の X をクリックしてコードアナライザ GUI を閉じます。
静的データまたは動的メモリーアクセスデータを収集したかどうかにかかわらず、アプリケーションをコンパイルし、計測機構を組み込み、実行して、コードカバレージデータを収集できます。動的メモリーエラーデータを収集する前に –g オプションでアプリケーションを構築した際には、計測機構を組み込む前にバイナリのコピーを保存していることになります。
カバレージデータ収集のために計測機能を組み込むよう、保存バイナリをコピーします。
$ cp a.out.save a.out
uncover でバイナリに計測機構を組み込みます。
$ uncover a.out
計測機構付きバイナリを実行してコードカバレージデータを収集します。
$ ./a.out
コードカバレージデータが、sample ディレクトリ内の a.out.uc ディレクトリに書き込まれます。
a.out.uc ディレクトリに対して uncover を実行します。
$ uncover -a a.out.uc
コードカバレージデータが sample/a.out.analyze/uncover ディレクトリに書き込まれます。
コードアナライザ GUI を起動して結果を表示します。
$ code-analyzer a.out &
「結果」タブに、静的な問題、動的メモリーの問題、およびコードカバレージの問題が表示されます。
結果をフィルタリングしてコードカバレージの問題だけを表示するには、「問題」タブで「カバレージ」オプションを選択します。
「結果」タブに、12 件のコードカバレージの問題だけが表示されます。各問題の説明には、潜在的なカバレージの割合が含まれています。この割合は、該当する関数をカバーするテストを追加した場合にアプリケーションの合計カバレージが何パーセント増加するかを示しています。
「問題」タブでは、カバレージの問題の 9 件が previse_all.c ソースファイル、3 件が sample2.c、および 1 件が previse_1.c に含まれています。
sample2.c ファイルの問題だけを表示するには、「問題」タブでそのファイルのオプションを選択します。
この時点で、「結果」タブには、sample2.c で見つかった 3 件のコードカバレージの問題だけが表示されます。
いずれかの問題でソースファイルパスのリンクをクリックして、ソースファイルを開きます。左の余白に警告アイコンが現れるまで、ソースファイルを下へスクロールします。
カバーされていないコードは黄色の各括弧でマークされます。
ファイルで見つかったカバレージの問題は、警告アイコン
でマークされます。