次の方法で共有


静的および動的な検証ツール

検証ツールには、次の 2 つの基本的なタイプがあります。

  • 静的検証ツールは、ドライバーを実行せずにドライバー コードを確認します。 これらのツールは、コードを実行するテストに依存しないため、非常に入念なテストを実行できます。 理論的には、静的検証ツールは、実際にはほとんど実行されないコード パスを含め、すべてのドライバー コードを調査できます。 ただし、ドライバーが実際に実行されていないため、誤検知の結果が生成される場合があります。 つまり、実際には発生しない可能性があるコード パスでエラーが報告される場合があります。

  • 動的検証ツールは、ドライバーの実行中にドライバー コードを調査します。通常、一般的に使用されるドライバー サポート ルーチンの呼び出しをインターセプトし、同じルーチンの独自のエラー チェック バージョンへの呼び出しに置き換えます。 動的ツールが検証を行っている間にドライバーが実際に実行されているため、誤検知が発生することはまれです。 ただし、動的ツールはドライバーの監視中に発生したアクションのみを検出するため、ドライバー テストの対象範囲が十分でない場合、ツールは特定のドライバーの欠陥を見逃す可能性があります。 同時に、実行時に利用可能な情報 (ソース コードから静的に抽出するのが困難な情報など) を使用することにより、動的検証ツールは、静的分析ツールでは検出が困難な特定のクラスのドライバー エラーを検出できます。

ベスト プラクティスは、静的検証ツールと動的検証ツールを組み合わせて使用することです。 静的ツールを使用すると、実際には実行が難しいコード パスをチェックできますが、動的ツールはドライバーで発生している重大なエラーを検出します。

重要

Windows ハードウェア互換性プログラムには、クライアントおよびサーバー オペレーティング システム上の静的ツール ロゴ (STL) テスト用の CodeQL が必要です。 引き続き、古い製品の SDV と CA のサポートを維持します。 パートナーは、静的ツール ロゴ テストの CodeQL 要件を確認することを強くお勧めします。 CodeQL の使用方法の詳細については、「 CodeQL と静的ツール ロゴ テストを参照してください。

検証ツールの調査

次の検証ツールは WDK に記載されており、ドライバーの開発者やテスト担当者が使用することをお勧めします。 これらは、通常使用する順序で一覧に記載されています。

コードがコンパイルされたらすぐに

  • GitHub の CodeQL は、強力なセマンティック コード分析エンジンで、広範で価値の高いセキュリティ クエリのスイートと堅牢なプラットフォームの組み合わせにより、ドライバー コードをセキュリティで保護するための非常に貴重なツールです。 詳しくは、「CodeQL と静的ツール ロゴ テスト」をご覧ください。

その他の静的ツール

ドライバーをビルドする Windows のバージョンによっては、他の静的ツールが必要になる場合があります。

  • ドライバーのコード分析は、コンパイル時に実行する静的検証ツールです。 ドライバーのコード分析では、C/C++ で記述されたドライバーとマネージド コードを確認できます。 ドライバーの各関数のコードを個別に調べるので、ドライバーをビルドするとすぐに実行できます。 比較的動作が速く、リソースをほとんど使用しません。

    Visual Studio のコード解析ツールの基本的な機能は、戻り値をチェックしないなどの一般的なコーディング エラーを検出します。 ドライバー固有の機能では、コピーした IRP に初期化されていないフィールドを残したり、ルーチンの最後までに変更された IRQL を復元しなかったりするなど、より微妙なドライバー コーディング エラーが検出されます。

  • 静的ドライバー検証ツール (SDV) は静的検証ツールで、コンパイル時に実行され、C/C++ で記述されたカーネル モード ドライバー コードを検証します。 これは WDK に含まれており、Visual Studio Ultimate 2012 または MSBuild を使用して、Visual Studio コマンド プロンプト ウィンドウから起動できます。

    一連のインターフェイス規則とオペレーティング システムのモデルに基づいて、静的ドライバー検証ツールは、ドライバーが Windows オペレーティング システムカーネルと正しくやり取りするかどうかを判断します。 静的ドライバー検証ツールは非常に徹底しています。ドライバーのソース コード内のすべての到達可能なパスを探索し、それらをシンボリックに実行します。 そのため、他の従来のドライバー テストでは検出されなかったバグを検出します。

重要

SDV はサポートされなくなり、Windows 24H2 WDK または EWDK リリースでは SDV を使用できません。 ビルド 26017 より新しい WDK では使用できません。また、Windows 24H2 RTM WDK には含まれていません。 SDV は、Windows 11 バージョン 22H2 EWDK (2023 年 10 月 24 日リリース) と Visual Studio ビルド ツール 17.1.5 を からダウンロードすることで引き続き使用。 SDV を実行する Enterprise WDK のみを使用することをお勧めします。 古いバージョンの標準 WDK を Visual Studio の最近のリリースと組み合わせて使用することはお勧めしません。これにより、分析エラーが発生する可能性があります。
今後、CodeQL はドライバーの主要な静的分析ツールになります。 CodeQL には、クエリ対象のデータベースとしてコードを扱う強力なクエリ言語が用意されているため、特定の動作やパターンなどに対するクエリを簡単に記述できます。 CodeQL の使用方法の詳細については、「 CodeQL と静的ツール ロゴ テストを参照してください。

ドライバーの実行時

ドライバーがビルドされ、明らかなエラーなしに動作するようになったらすぐに、次の動的検証ツールを使用してください。

  • ドライバー検証ツールは、特に Windows ドライバー用に記述された動的検証ツールです。 複数のドライバーに対して同時に実行できる複数のテストが含まれています。 ドライバー検証ツールは、ドライバーの重大なバグを発見するのに非常に効果的であるため、経験豊富なドライバー開発者やテスト担当者は、開発環境やテスト環境でドライバーが実行されるときは常にドライバー検証ツールが実行されるように設定しています。 ドライバーの検証ツールは、Windows に含まれています。 ドライバーのドライバー検証ツールを有効にする場合は、ドライバー対して複数のテストを実行する必要があります。 ドライバー検証ツールは、静的検証ツールのみを使用して、検出が困難な特定のドライバーのバグを検出できます。 これらの種類のバグの例には、次のようなものがあります。

    • カーネル プール バッファー オーバーラン。 検証済みドライバーがプール メモリ バッファーを割り当てると、ドライバー検証ツールは、それらをアクセス不可能なメモリ ページで保護します。 ドライバーがバッファーの末尾を超えてメモリを使用しようとした場合、ドライバー検証ツールはバグ チェックを発行します。

    • 解放後のメモリの使用。 特別なプール メモリ ブロックは、独自のメモリ ページを使用し、他の割り当てとメモリ ページを共有しません。 ドライバーがプール メモリのブロックを解放すると、対応するメモリ ページにアクセスできなくなります。 ドライバーが解放後にそのメモリを使用しようとすると、ドライバーはすぐにクラッシュします。

    • 管理者特権で IRQL を実行中にページング可能なメモリを使用する。 検証済みドライバーが IRQL を DISPATCH_LEVEL 以上で発生させると、ドライバー検証ツールは、メモリ不足になったシステムをシミュレートして、システムワーキング セットからページング可能なすべてのメモリを削除します。 これらのページング可能な仮想アドレスのいずれかを使用しようとすると、ドライバーがクラッシュします。

    • 低リソースのシミュレーション。 低リソース条件でシステムをシミュレートするために、ドライバー検証ツールは、ドライバーによって呼び出されるさまざまなオペレーティング システム カーネル API を失敗させることができます。

    • メモリ リーク。 ドライバー検証ツールは、ドライバーによるメモリ割り当てを追跡し、ドライバーがアンロードされる前にメモリが解放されていることを確認します。

    • 完了または取り消しに時間がかかりすぎる I/O 操作。 ドライバー検証ツールは、IoCallDriverからの STATUS_PENDING の戻り値に応答するドライバーのロジックをテストできます。

    • DDI コンプライアンス チェック。 (Windows 8 以降で利用可能) このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーとオペレーティング システムのカーネル インターフェイス間の適切な相互作用をチェックする一連のデバイス ドライバー インターフェイス (DDI) ルールを適用します。 これらのルールは、静的ドライバー検証ツールがドライバーのソース コードを解析する際に使用するルールに対応しています。 DDI コンプライアンス チェックが有効化されているときにドライバー検証ツールでエラーが検出された場合は、静的ドライバー検証ツールを実行し、エラーの原因となったのと同じルールを選択します。 静的ドライバー検証ツールは、ドライバーのソースコードから不具合の原因を突き止めるのに役立ちます。

  • アプリケーション検証ツールは、C/C++ で記述されたユーザー モード アプリケーションとドライバーの動的検証ツールです。 マネージド コードは検証されません。