ドライバーのコード分析の概要

Windows Driver Kit (WDK) には、Microsoft Visual Studio Ultimate 2012 のコード分析ツールに対するドライバー固有の拡張機能が含まれています。ドライバーのコード分析には、ドライバー (特にカーネル モード ドライバー) にのみ適用されるルールが使われます。ドライバーのコード分析を使うと、コードをコンパイルする準備が整った時点ですぐに、その潜在的なエラーを検出することができます。

コード分析ツールのしくみ

コード分析ツールは、ビルド ユーティリティの標準コンパイラ (Cl.exe) の呼び出しをインターセプトし、CL インターセプト コンパイラを代わりに実行します。CL インターセプト コンパイラによって、ドライバーのソース コードが分析され、エラーや警告メッセージのログ ファイルが作成されます。コード分析ツールは単体で実行できるほか、ドライバーをビルドするときにコード分析ツールが実行されるように構成することもできます。[Analyze] (分析) の [Run Code Analysis on Solution] (ソリューションに対してコード分析を実行) を選び、コード分析ツールを単体で実行した場合、その結果が [Code Analysis Report] (コード分析レポート) ウィンドウに表示されます。コード分析ツールをビルド過程に組み込んで実行した場合、CL インターセプト コンパイラが、エラー メッセージや警告メッセージのログ ファイルを作成したうえで、標準バージョンの Cl.exe を呼び出し、ビルド出力を生成します。生成されるオブジェクト ファイルは、標準のビルド コマンドによる成果物と同じです。

インターセプト コンパイラを実行すると、ドライバーのコード分析がコード内の各関数を個別に調査し、想定されるあらゆるコード実行パスをシミュレートしながら、一般的なドライバーのエラーや問題のあるコーディング手法を探します。大きなドライバーでもコード分析ツールは比較的短時間で実行され、生成されるレポートには、エラーの疑いのあるコード行が正確に特定されます。

コード分析で検出できるエラーの種類

コード分析では、さまざまな種類のエラーを検出できます。次に示したのは、検出できるエラー カテゴリの例です。

  • メモリ: メモリ リーク、NULL ポインターの逆参照、初期化されていないメモリへのアクセス、カーネル モード スタックの過剰な使用、プール タグの不適切な使用など。

  • リソース: 特定の関数を呼び出すときに保持する必要のある (または保持すべきではない) リソースや、ロックなどのリソースの解放漏れ。

  • 関数の使用: 特定の関数の用法や引数の指定に誤りがある、厳密な型チェックを行わない関数で引数の型が一致していない、廃止予定の関数が使われている、関数呼び出しの IRQL が不適切であるなど。

  • 浮動小数点の状態: ドライバーの浮動小数点ハードウェアの状態が保護されていない、浮動小数点の状態を保存時とは異なる IRQL で復元しようとしているなど。

  • 優先度ルール: C プログラミングの優先度ルールが原因で、プログラマの意図したとおりに動作しない可能性のあるコード。

  • カーネル モードのコーディング手法: エラーを招くコーディング手法。たとえば、不透明 (opaque) なメモリ記述子リスト (MDL) 構造体に変更を加える、呼び出した関数によって設定された変数の値を検査していない、Ntstrsafe.h に定義されている安全な文字列関数ではなく C/C++ の文字列操作関数を使っているなど。

  • ドライバーに固有のコーディング手法: カーネル モード ドライバーでエラーの原因となることの多い特定の操作。たとえば、メンバーを変更せずに I/O 要求パケット (IRP) 全体をコピーしたり、DriverEntry ルーチンで引数をコピーせずに文字列引数や構造体引数のポインターを保存したりすることが挙げられます。

コード分析の警告

コード分析ツールは、ルール ベースのモデルを使って、プログラムやドライバーのコードに存在するエラーを特定します。それぞれのルールには警告が関連付けられ、ルールへの違反をコード分析ツールが検出した場合に、対応する警告が報告されます。ドライバー固有の警告について詳しくは、「ドライバーのコード分析の警告」をご覧ください。Visual Studio Ultimate 2012 のコード分析ツールから報告される主要な警告については、コード分析の警告に関するページをご覧ください。

注釈

コード分析ツールの重要な機能の 1 つは、関数の記述など、ドライバーのソース コードの各種エンティティに注釈を設定できることです。コード分析ツールでは、関数の境界を越えた分析が可能です。つまり、関数と関数の相互作用が分析されます。注釈の目的は、呼び出す側と呼び出される側の関数の決まりごと (コントラクト) を漏れなく規定し、それが満たされているかどうかをコード分析ツールでチェックできるようにすることです。また、関数の適切な用法がどのようなもので、どのような結果が想定されるかを、コードを読むすべての人に伝えることも注釈の目的の 1 つです。注釈は、インターフェイスのコントラクトを宣言するものであり、その実現方法を記述するものではありません。コード分析ツールの実行結果は、適切な注釈が設定されていないことによるものがほとんどです。注釈を追加することによって、注釈の欠如についての警告を抑制できるだけでなく、より踏み込んだチェックが可能になります。詳しくは、「Windows ドライバーの SAL 2.0 注釈」をご覧ください。 SAL 2.0 について詳しくは、SAL 注釈を使って C/C++ コードの欠陥を減らす方法に関するページをご覧ください。SAL 2.0 は SAL 1.0 の後継です。 WDK for Windows 8 では SAL 2.0 を使う必要があります。ドライバー用 SAL 1.0 についての情報が必要な場合は、PREfast for Drivers の注釈についてのドキュメントが WDK for Windows 7 に付属していますので、そちらをご覧ください。

結果の解釈

Code Analysis for Drivers はすばやく簡単に実行できます。きわめて大きなドライバーやプログラムに対しても同様です。開発者は、出力結果を調べ、コード分析ツールによって検出されたエラーを分析して、本当のコーディング エラーと誤検出とを区別する必要があります。

コード分析ツールで検出される各警告について説明した総合的なリファレンスについては、「ドライバーのコード分析の警告」をご覧ください。Visual Studio Ultimate 2012 のコード分析ツールから報告される主要な警告については、コード分析の警告に関するページをご覧ください。

通常、コード分析の警告を解決する際は、ソース コードを必要に応じて更新したり、関数のコントラクトを明確にする注釈を追加したりする作業が伴います。 注釈を追加することによって、今後、関数の呼び出し元にコントラクトの履行を徹底させることができ、また、コードの読みやすさも向上します。

コード分析の結果として検出されたエラーを注意深く調べたうえで、それらが誤検出であり、注釈を設定しても回避できないことがわかった場合は、それらの警告を除外 (または抑制) することができます。 詳しくは、「ドライバーのコード分析を実行する方法」をご覧ください。

関連トピック

ドライバーのコード分析を実行する方法
Visual Studio のコード分析ツール
ドライバーのコード分析の警告
コード分析の警告
Windows ドライバーの SAL 2.0 注釈

 

 

表示:
© 2014 Microsoft