ドライバーのコード分析の概要
Windows Driver Kit は、Microsoft Visual Studio のコード分析ツールにドライバー固有の拡張機能を提供します。 ドライバーのコード分析には、ドライバー、特にカーネル モード ドライバーにのみ適用されるルールが含まれています。 ドライバーのコード分析では、コードがコンパイルされるとすぐに、コード内の潜在的なエラーを検出できます。
重要
ドライバーのコード分析は Windows 24H2 WDK と EWDK で利用できますが、今後廃止される予定であることをお勧めします。
今後、CodeQL はドライバーの主要な静的分析ツールになります。 CodeQL には、クエリ対象のデータベースとしてコードを扱う強力なクエリ言語が用意されているため、特定の動作やパターンなどに対するクエリを簡単に記述できます。
CodeQL の使用方法の詳細については、「 CodeQL と静的ツール ロゴ テストを参照してください。
コード分析ツールの仕組み
コード分析ツールは、ビルド ユーティリティによる標準コンパイラ Cl.exe の呼び出しをインターセプトし、代わりにドライバーのソース コードを分析し、エラーおよび警告メッセージのログ ファイルを作成する CL インターセプト コンパイラーを実行します。 コード分析ツールは単独で実行することも、ドライバーのビルド時にコード分析ツールを実行するように構成することもできます。 コード分析ツールを単独で実行すると (分析 >ソリューションでコード分析を実行)、結果がコード分析レポート ウィンドウに表示されます。 ビルドの一部としてコード分析ツールを実行すると、CL インターセプト コンパイラーはエラーおよび警告メッセージのログ ファイルを作成し、標準バージョンの Cl.exe を呼び出してビルド出力を生成します。 結果として得られるオブジェクト ファイルは、標準のビルド コマンドによって生成されるものと同じです。
インターセプト コンパイラーが実行されると、ドライバーのコード分析はコード内の各関数を個別に検査し、コード内のすべての可能なパスの実行をシミュレートして、一般的なドライバー エラーと賢明でないコーディング方法を探します。 コード分析ツールは、大規模なドライバーであっても比較的高速に実行され、生成されるレポートは、エラーが疑われるドライバー コードの行を正確に特定します。
コード分析が検出できるエラーの種類
コード分析では、次のカテゴリのエラーを含む、いくつかの種類のエラーを検出できます。
メモリ:潜在的なメモリ リーク、逆参照された NULL ポインタ、初期化されていないメモリへのアクセス、カーネル モード スタックの過剰な使用、およびプール タグの不適切な使用。
リソース:ロックなどのリソース、一部の関数を呼び出すときに保持すべきリソース、および他の関数を呼び出すときに保持すべきではないリソースの解放に失敗する。
機能の使用: 特定の関数の不正な使用の可能性、不正に見える関数の引数、型を厳密にチェックしない関数の引数の型の不一致の可能性、特定の廃止された関数の使用の可能性、および不正な可能性がある IRQL での関数呼び出し。
浮動小数点状態: ドライバー内の浮動小数点ハードウェア状態の保護に失敗し、浮動小数点状態を別の IRQL で保存した後に復元しようとしました。
優先規則: C プログラミングの優先規則により、プログラマが意図したとおりに動作しない可能性のあるコード。
カーネルモードコーディングの実践: 不透明なメモリ記述子リスト (MDL) 構造の変更、呼び出された関数によって設定された変数の値の検査の失敗、で定義されている安全な文字列関数ではなく C/C++ 文字列操作関数の使用など、エラーを引き起こす可能性のあるコーディング手法 Ntstrsafe.h.
ドライバー固有のコーディング方法: カーネル モード ドライバーのエラーの原因となることが多い特定の操作。 たとえば、メンバーを変更せずに I/O 要求パケット (IRP) 全体をコピーし、DriverEntry ルーチンの引数をコピーする代わりに文字列または構造体引数へのポインターを保存します。
コード分析の警告
コード分析ツールは、ルールベースのモデルを使用して、プログラムまたはドライバー コード内のエラーを特定します。 各ルールは、コード分析ツールがルール違反を検出した場合に報告される警告に関連付けられています。 ドライバー固有の警告の詳細については、「ドライバー警告のコード分析」を参照してください。 Visual Studio のコード分析ツールが報告する主要な警告セットについては、「コード分析の警告」を参照してください。
注釈
コード分析ツールが提供する重要な機能の 1 つは、ドライバーのソース コード内の関数の説明やその他のエンティティに注釈を付ける機能です。 コード分析ツールには機能内の範囲があります。 つまり、関数間の相互作用を分析します。 注釈の目的は、呼び出される関数と呼び出し元の関数の間のコントラクトをより完全に表現して、コード分析ツールがコントラクトが満たされていることを確認できるようにすることです。 アノテーションのもう 1 つの目的は、コードを読む人に、関数がどのように使用されるべきか、どのような結果が期待できるかを知らせることです。 アノテーションはインターフェースのコントラクトを宣言するものであり、そのコントラクトがどのように達成されるかを説明しようとするものではありません。 多くの場合、コード分析ツールの実行結果には、適切な注釈が存在しないことが反映されます。注釈を追加すると、注釈の欠落に関する警告が抑制され、追加のチェックが有効になります。 詳細については、「Windows ドライバーの SAL 2.0 注釈」を参照してください。 SAL 2.0の詳細については、「SAL アノテーションを使用した C/C++ コードの欠陥削減」を参照してください。 ドライバーのコード解析の概要 ドライバーのコード分析の概要 Windows Driver Kit は、Microsoft Visual Studio のコード分析ツールにドライバー固有の拡張機能を提供します。
ドライバーのコード分析には、ドライバー、特にカーネル モード ドライバーにのみ適用されるルールが含まれています。
ドライバーのコード分析では、コードがコンパイルされるとすぐに、コード内の潜在的なエラーを検出できます。 コード分析ツールの仕組み
コード分析ツールは、ビルド ユーティリティによる標準コンパイラ Cl.exe の呼び出しをインターセプトし、代わりにドライバーのソース コードを分析し、エラーおよび警告メッセージのログ ファイルを作成する CL インターセプト コンパイラーを実行します。 Visual Studio のコード分析ツールが報告する主要な警告セットについては、「コード分析の警告」を参照してください。
コード分析の警告を解決するには、通常、適切な場合はソースコードを更新するか、アノテーションを追加して関数契約を明確化する方法があります。 アノテーションを追加すると、アナライザーは今後の呼び出し元すべてに対して契約を強制的に適用できるようになるだけでなく、可読性も向上します。
慎重に検討した結果、コード分析結果にエラーが表示され、注釈を使用しても回避できないことが判明した場合、これらの警告を非表示または抑制することを選択できます。 詳細については、「ドライバー向けコード分析の実行方法」を参照してください。