インテル® C++ コンパイラー・プロフェッショナル・エディションでは、次のソースコード解析機能が提供されています。
ソースチェッカーは、ソースコードの詳細な解析に基づく高度な診断を提供するコンパイラー機能です。スタティック・グローバル解析を行い、コンパイラーでは検知されないソフトウェア中のエラーを発見します。この一般的なソースコード解析ツールは、プログラムのデバッグにも役立つ追加の診断機能を提供します。ソースコードの解析オプションを使用して、以下のようなコンパイル済みコードの潜在的なエラーを検出することができます。
OpenMP* 宣言子の誤った使用
異なるプログラムユニットでの一貫性のないオブジェクト宣言
境界違反
初期化されていないメモリー
メモリー破壊
メモリーリーク
ポインターと割付け配列の誤った使用
不要コードと冗長な実行
入力ミスまたは初期化されていない変数
ソースチェッカーは、ソースファイルの解析と問題の検出に使用することができます。ソースファイルは、プログラム全体を形成している必要はありません (例えば、ライブラリー・ソースをチェックできます)。ただし、そのような場合、グローバル・オブジェクトの使用や変更、ルーチンへの呼び出しなどについての情報が不足しているため、解析の精度が低くなります。
ソースコードの解析を使用するには、そのコードがエラーなしでコンパイルに成功していなければなりません。
ソースチェッカーでは役立つ診断情報が得られます。実行ファイルは生成されません。ソースチェッカーの解析中に生成されたオブジェクト・ファイルとライブラリー・ファイルは、実行ファイル、ダイナミック・ライブラリー、スタティック・ライブラリーの生成に使用することはできません。
ソースチェッカーの解析では、同時にすべての設定可能な値で、プログラムの一般的な概要チェックを行います。これは、入力変数の固定値セットでプログラムを実行するランタイム・チェック・ツールとは対照的です。そのようなツールは、すべてのエッジ効果を簡単にチェックできません。入力変数の固定値セットを使用しないことで、ソースチェッカーの解析ではすべての可能性のあるケースをチェックすることができます。
ソースチェッカーは、解析プログラムのフル解釈はしないため、偽陽性メッセージと呼ばれるメッセージを生成することがあります。これは、コンパイラーが生成するエラーとソースチェッカーが生成するエラーの根本的な違いです。ソースチェッカーの場合、生成されたエラーが正当なもので修正の必要があるかどうかはユーザーが判断します。
例 1: ゼロ除算のエラーメッセージ
この例では、パラメーター x の設定可能な値は {6,3} で、パラメーター y の設定可能な値は {3,0} です。x と y の値の両方が 3 の場合は、x-y = 0 です。ソースチェッカーは、x と y の値 3 が共存できないことを識別できません。
1 #include <stdio.h>
2
3 double foo(int x, int y) {
4 return 1 / (x - y);
5 }
6
7 int main() {
8 printf("%f\n", foo(6, 3));
9 printf("%f\n", foo(3, 0));
10 return 0;
11 }
ソースチェッカーで次のメッセージが発行されます。
f1.c(4): エラー #12062: ゼロ除算の可能性があります。
例 2: 非初期化の不正なメッセージ
この例は、条件ステートメントから疑陽性 が導かれるケースを示しています。
1 #include <stdio.h>
2
3 int main(int n) {
4 int j;
5 if (n != 0) {
6 j = n;
7 }
8 if (n != 0) {
9 printf("%d\n", j);
10 }
11 return 0;
12 }
ソースチェッカーで次のメッセージが発行されます。
f1.c(9): エラー #12144: "j" は初期化されていない可能性があります。
並列プログラムの記述とデバッグには、専門の知識とツールが必要です。parallel lint は、並列アプリケーションの開発と既存のシリアル・アプリケーションの並列化の両方で役立ちます。parallel lint は、ソースチェッカーのアルゴリズムに基づいて OpenMP プログラムの並列化解析を行うソースコードの解析機能です。 OpenMP 3.0 規格がサポートされています。OpenMP は、並列化を表現する各種の方法を提供します。parallel lint では、下記の OpenMP 宣言子と節に関する問題を診断します。
OpenMP プログラムは仕様の全要件を満たすことがありますが、それでも重大なセマンティックの問題が残ります。parallel lint は以下の診断に役立ちます。
parallel lint は、プロシージャー間の解析も実行し、異なるプロシージャーやファイルにある並列宣言子の問題を発見することができます。
ソースコード解析には次のオプションがあります。
オプション |
結果 |
---|---|
-diag-enable sc{[1|2|3]} (Linux* および Mac OS* X) /Qdiag-enable:sc{[1|2|3]} (Windows*) |
ソースチェッカーの解析を有効にします。数字は、診断レベル (1= すべてのクリティカル・エラー、2= すべてのエラー、3= すべてのエラーと警告) を指定します。 |
-diag-disable sc /Qdiag-disable:sc |
ソースチェッカーの解析を無効にします。 |
-diag-enable sc-parallel{[1|2|3]} /Qdiag-enable:sc-parallel{[1|2|3]} |
parallel lint 解析を有効にします。数字は、診断レベル (1= すべてのクリティカル・エラー、2= すべてのエラー、3= すべてのエラーと警告) を指定します。 |
-diag-disable sc-parallel /Qdiag-disable:sc-parallel |
parallel lint 解析を無効にします。 |
-diag-enable sc-include /Qdiag-enable:sc-include |
インクルード・ファイルとソースファイルを解析します。 |
-diag-disable warn /Qdiag-disable:warn |
ソースコード解析固有のメッセージを含むすべての警告、注意、コメント (エラーのみを発行します) を表示しないようにします。 |
-diag-disable num-list /Qdiag-disable:num-list |
番号リストによりメッセージを表示しないようにします。num-list は 1 つのメッセージまたはカンマや括弧で区切られたメッセージ番号のリストです。 |
-diag-file [file] /Qdiag-file[:file] |
診断結果を .diag (デフォルトの拡張子) ファイルに送ります。ファイルに送る前にソースコード解析の診断を有効にする必要があります。ファイル名が指定されていない場合は、診断結果は name-of-the-first-source-file.diag に送られます。 |
-diag-file-append[=file] /Qdiag-file-append[:file] |
診断結果を .diag (デフォルトの拡張子) ファイルに追加します。結果をファイルに送る前にソースコード解析の診断を有効にする必要があります。パスを指定しない場合、現在の作業ディレクトリーが検索されます。指定された名前のファイルがない場合は、その名前の新しいファイルが作成されます。ファイル名が指定されていない場合は、診断結果は name-of-the-first-source-file.diag に送られます。 |
注意事項:
-c (Linux および Mac OS X) または /c (Windows) コンパイラー・オプションがコマンドライン・オプションとともにコマンドラインで使用され、ソースコード解析が有効にされた場合は、オブジェクト・ファイルが作成されます。ソースコード解析の診断結果は生成されません。このオブジェクト・ファイルは、後でソースコード解析を起動する際に使用される場合があります。完全なソースコードの診断結果を入手するには、ソースコード解析オプションをコンパイル・フェーズとリンクフェーズの両方で指定します。この機能は、プログラムが異なる言語 (C/C++ と Fortran) で記述されたファイルで構成されたプログラムの場合に役立ちます。
icc -c -diag-enable sc2 file1.c
ifort -c -diag-enable sc2 file2.f90
icc -diag-enable sc2 file1.obj file2.obj
OpenMP 宣言子を解析するには、-openmp (Linux および Mac OS X) オプションまたは /Qopenmp (Windows) オプションをコマンドラインに追加します。
IDE 内でソースコード解析サポートを有効にすると、通常ビルドによって生成される最終ファイル (実行ファイルなど) が作成されません。そのため、別途「ソースコード解析」構成を作成する必要があります。
Eclipse* IDE では、次の操作を行ってください。
プロジェクトのプロパティー・ページを開いて、[C/C++ Build (C/C++ ビルド)] を選択します。
[Manage… (管理…)] ボタンをクリックします。
[Manage (管理)] ダイアログボックスで、[New…(新規)] ボタンをクリックして、[Create configuration (構成を作成)] ダイアログボックスを開きます。
[Name (名前)] ボックスで、新しい構成の名前を指定します (例: Source Code Analysis)。
必要に応じて、[Description (記述)] に構成の説明を入力します。
[Copy settings from (設定のコピー元)]、[Default configuration (デフォルト構成)]、または [Existing configuration (既存構成)] ラジオボタンをクリックして、対応するドロップダウンメニューから構成を選択します。
[OK] をクリックして [Create configuration (構成を作成)] ダイアログを閉じます。
[OK] をクリックして (新しい構成名が選択されている) [Manage (管理)] ダイアログを閉じます。
プロパティー・ページに新しい構成が表示されます。また、新しい構成がアクティブ構成に指定されます。コンパイラーの [Compilation Diagnostics (コンパイル診断)] を表示します。[Level of Source Code Parallelization Analysis (ソースコードの並列化解析レベル)]、[Level of Source Code Analysis (ソースコードの解析レベル)]、[Analyze Include Files (インクルード・ファイルの解析)] プロパティーでソースコード解析を管理します。
ソースチェッカー解析には、次の機能が含まれます。