インテル® Fortran コンパイラー 14.0 ユーザー・リファレンス・ガイド

スタティック解析の概要

スタティック解析は、OS X* システムではサポートされていません。

スタティック解析とは、ソースコードの詳細な解析を通じてソフトウェアのエラーとセキュリティーの脆弱性を発見するプロセスです。

この機能を利用するには、別の製品をインストールする必要があります。詳細は、 「機能要件」を参照してください。

スタティック解析では、アプリケーションのセキュリティーを突破したり、あるいはアプリケーションを機能不全にするような攻撃者に悪用される可能性のある幅広い範囲のエラーを見つけられます。検知されるエラーには、バッファー・オーバーフロー、ポインターとヒープストレージの誤用、C/C++ または Fortran 言語機能の安全ではない使用、あるいは誤った使用、そして OpenMP* 並列プログラミング構造の誤用などがあります。

スタティック解析では、インテル® コンパイラーで重大なエラーなくコードがコンパイルされている必要があります。

プロダクション・バイナリーのビルドにインテル® コンパイラーを使用する予定がない場合でも、スタティック解析を使用することができます。同様に、インテル® コンパイラーでサポートされていないプロセッサーの種類で動作するプログラムにも使用できます。

スタティック解析の動作

コンパイラーは特殊なモードで動作して、要求された解析を実行します。このモードでは、コンパイラーは解析により時間をかけ、命令生成プロセス全体を省略します。これにより、通常のコンパイルでは検知されないエラーを発見することができます。つまり、コードは、インテル® コンパイラーで重大なエラーなくコンパイルされている必要があります。ただし、コンパイルの結果は実行できません。 したがって、プロダクション・バイナリーのビルドにインテル® コンパイラーを使用する予定がない場合でも、スタティック解析を使用することができます。

スタティック解析は最初に、それぞれのソースファイルを個別に処理し、擬似オブジェクト・モジュールを生成します。実際のオブジェクト・モジュールを壊さないように、スタティック解析で生成される擬似オブジェクト・モジュールは実際のオブジェクト・モジュールとは分けられています。

解析結果はリンク段階で生成されます。これは、最終命令がリンク段階でのみ生成されるプロシージャー間の最適化 (IPO) の動作と似ています。これにより、スタティック解析でプロシージャーとファイル境界にわたるエラーを発見できます。これは、直接リンカーを起動するのではなく、コンパイラーによりリンク段階を起動しなければならないことを意味します。

スタティック解析モード

スタティック解析は、セキュリティーの脆弱性や論理エラーが存在するという決定的でない証拠を検出する場合があります。その場合、ツールの正しい動作というものはありません。サイレントリスクの検出漏れが生じる (つまり、実際のエラーが検出されない) 一方、誤検出の診断メッセージが出力されます。これに対応するため、スタティック解析は 3 つの解析モードを提供しています。最適なモードは、状況と目的に依存します。

解析モードは、-diag-enable sc-{full|concise|precise} オプション (Linux*) または /Qdiag-enable:sc-{full|concise|precise} オプション (Windows*) を使用して指定します。

スタティック解析: プログラム全体と単一ファイル

スタティック解析は、プログラム全体または単一ファイルに対して行うことができます。指定するコンパイラー・オプションにより、スタティック解析で各ソースファイルを個別に処理するかどうかを指示します。プログラム全体の解析をスキップすると、大規模なプログラムでメモリーの使用と解析時間を抑えることができますが、検出される実際のエラーは少なくなります。

多くのエラーは、グローバルなプログラム全体の解析を通してのみ検出することができます。単一ファイルの解析ではこれらのエラーを検出することができません。一方、非常に大きなプログラムでは、プログラム全体の解析に長い時間がかかります。単一ファイルの解析を使用することで、解析にかかる時間を大幅に減らし (数時間から数分に短縮できることもあります)、より頻繁に解析を実行することができます。コストの低い早期に不具合を検出し修正できるため、これはコスト効率の良い方法と言えます。

一部のファイルでは、単一ファイルの解析に長い時間がかかることがあります。多数の小さなファイルからなるプログラムの場合、各ファイルを個別に処理するよりも、いったんすべてをメモリーに読み込んでしまったほうが速くなります。その場合、単一ファイルの分析はその利点が得られないため使用すべきではありません。

単一ファイルの解析は、-diag-enable sc-single-file オプション (Linux*) または /Qdiag-enable:sc-single-file オプション (Windows*) を使用して指定します。

スタティック解析と列挙型の変数

Fortran と C が混在したプログラムでは、スタティック解析は、C++ プログラムで列挙型の変数を関連する列挙リテラルと等しい既知の値として扱うオプションを提供します。デフォルトでは、スタティック解析は不明な列挙型の変数を不明な整数値として扱います。

このオプションを有効にすると、より多くのエラーが検出されますが、誤検出の可能性が高まります。

次のような C++ プログラムについて考えてみます。

typedef enum {red = -1, yellow = 0, blue= 1} color;
volatile int v1;
volatile color v2;
int x[10];
int f() {
    int y1 = v1;
    int y2 = v1;
    color y3 = v2;
    if ((y2 >= -1) && (y2 <= 1))
       return (x[y1] + x[y2] + x[y3]);
    else return 0;
}

このプログラムは、不明な値のソースとして volatile グローバル変数を使用します。不明な値が発生する場合はほかにもあります。

3 つの配列インデックスの操作のいずれも、境界違反を引き起こす可能性があります。

C++ プログラムでの列挙型の扱いは、-diag-enable sc-enums オプション (Linux*) または /Qdiag-enable:sc-enums オプション (Windows*) を使用して指定します。

スタティック解析の推奨事項

スタティック解析は、完全なプログラムで最も効果を発揮します。これは、問題の中にはソースファイル間の対話を解析することによりのみ検知できるものがあるためです。スタティック解析を部分的なプログラム、あるいはより少ないモジュールをリンクして単一ファイルでも実行可能です。単一ファイルの解析オプションを使用して、処理速度を向上することもできます。 ただし、この場合、プログラム全体の解析なら発見できるような問題を検知できないことがあります。常にはプログラム全体の解析を使用しない場合であっても、プログラムエラーの検出漏れがないように、定期的にプログラム全体の解析を行ってください。

スタティック解析をライブラリーに対してビルド、リンクを行うプロジェクトで使用する場合、そのライブラリーにリンクするプロジェクトを解析する前にライブラリーを解析してください。解析済みのライブラリーにリンクするプロジェクトを解析する際、ライブラリー・ソースがあたかもアプリケーションの一部であるかのように、ライブラリーのモジュールは完全に解析に含められます。

ライブラリー自体を解析すると、そのライブラリー内の問題のみが診断されます。コンパイル段階中に生成された擬似オブジェクト・モジュールは、標準的なライブラリアン・ユーティリティーを使用して、スタティック・リンク・ライブラリーに結合できます。ダイナミック・ライブラリーの解析時に、スタティック・ライブラリーは通常のエクスポート・ライブラリーの代わりに、リンク段階中に生成されます。解析されないライブラリーへのリンクも許可されていますが、解析されていないライブラリーは解析には含まれません。

多くの場合、スタティック解析は [Precise (厳密)] モードで開始すると良いでしょう (diag-enable:sc-precise)。そうすることで、最も明白な問題を素早く見つけることができます。その後、より強力な解析モードに移ることができます。

列挙型変数のより厳密なチェックにより、その他のエラーが検出されることがありますが、誤検出の可能性も高くなります。-diag-enable sc-enums オプション (Linux*) または /Qdiag-enable:sc-enums オプションを使用すべきかどうか判断するには、まずこのオプションを指定せずにスタティック解析を実行し、その後、ソース変更をしないでこのオプションを指定して解析を実行します。 新しい問題がいくつか見つかった場合は、それらを調査します。新しい問題が多数見つかった場合は、このオプションは使用しないほうが良いでしょう。

関連情報


このヘルプトピックについてのフィードバックを送信