ドライバーの Code Analysis の警告
このセクションでは、ドライバー コードに潜在的なエラーが検出されたときに、ドライバーのコード分析が報告する警告の一覧と説明を示します。 一部の警告はカーネル モード コードを対象としており、ユーザー モード ドライバーを分析するときに無視できることに注意してください。
重要
ドライバーのコード分析は Windows 24H2 WDK と EWDK で利用できますが、今後廃止される予定であることをお勧めします。
今後、CodeQL はドライバーの主要な静的分析ツールになります。 CodeQL には、クエリ対象のデータベースとしてコードを扱う強力なクエリ言語が用意されているため、特定の動作やパターンなどに対するクエリを簡単に記述できます。
CodeQL の使用方法の詳細については、「 CodeQL と静的ツール ロゴ テストを参照してください。
ドライバーのコード分析では、次の種類の警告が報告されます。
一般的な警告 (6000 から 6999): C および C++ 構文および一般的なコーディング方法でエラーが発生する可能性があります。 これらの警告の詳細については、「C/C++ 警告のコード分析」を参照してください。
Windows 固有の警告 (28600-28799): これらの警告は、Windows での特定の使用パターンに固有のものですが、ドライバーに固有ではありません。
ドライバー固有の警告 (28100-28199): アプリケーション、他のドライバー、およびオペレーティング システムとドライバーとの相互作用におけるエラー。
注釈エラー (28200-28299 および 36000-36999): これらの警告は、注釈が誤ってコード化されたか、不適切なコンテキストで使用されたことを示します。 たいていの場合、このような警告が表示されるのは、注釈が期待どおりに(あるいはまったく)効果を発揮していないことを示しています。
メモリ割り当ての警告 (30029-30035): メモリ割り当ての警告です。
このセクションの内容
トピック | 説明 |
---|---|
警告 C28101: ドライバーモジュールは、現在の関数が正しいタイプの関数ではないと推論しました。 |
|
警告 C28110: ドライバーは浮動小数点ハードウェア状態を保護する必要があります。 float の使用法を参照 |
|
警告 C28111: 浮動小数点状態が保存されたIRQL は、現在のIRQL(この復元操作の場合) と一致しません。 |
|
警告:C28114: IRPスタックエントリ全体をコピーすると、クリアまたは更新する必要がある特定のフィールドが初期化されたままになります。 |
|
警告 C28120: この関数は、現在のIRQレベルでは呼び出すことができません。 現在のレベルが低すぎます。 |
|
警告 C28121: この関数は、現在のIRQレベルでは呼び出すことができません。 現在のレベルが高すぎます。 |
|
警告 C28122: この関数は、低い IRQ レベルで呼び出すことは許可されていません。 以前の関数呼び出しはこの制約と矛盾します。 |
|
警告 C28123: この関数を高いIRQレベルで呼び出すことは許可されていません。 以前の関数呼び出しはこの制約と矛盾します。 |
|
警告 C28124: を呼び出すと、IRQレベルが分析対象の関数に許容される最小値よりも低く設定されます。 |
|
警告 C28126: ObReferenceObject* の AccessModeパラメータは IRP->RequestorModeである必要があります |
|
警告 C28127: ルーチンとして使用されている関数は、予期される型と正確に一致しません。 |
|
警告 C28128: フィールドへの直接アクセスが行われました。 それはルーチンで作られるべきです。 |
|
警告 C28129: オペランドへの割り当てが行われています。ビットのセットとクリアを使用してのみ変更する必要があります。 |
|
警告 C28131: マネージャがバッファを解放するため、DriverEntry ルーチンはポインタではなく引数のコピーを保存する必要があります。 |
|
警告 C28132: ポインタのサイズを取得します |
|
警告 C28133: IoInitializeTimerはAddDeviceから呼び出すのが最適です |
|
警告 C28134: プールタグの型は文字列や文字列ポインタではなく、整数である必要があります。 |
|
警告 C28135: KeWaitForSingleObjectの最初の引数がローカル変数の場合、Modeパラメータは KernelModeである必要があります。 |
|
警告 C28139: 引数は型と正確に一致する必要があります |
|
警告 C28141: この引数により、IRQレベルが現在のIRQLよりも低く設定されるため、この関数はその目的には使用できません |
|
警告 C28143: IoMarkIrpPendingを呼び出すディスパッチ ルーチンも STATUS_PENDING を返す必要があります |
|
警告 C28144: キャンセルルーチン内では、終了時点で、Irp->CancelIrqlのIRQLが現在のIRQLである必要があります。 |
|
警告 C28145: 不透明なMDL構造はドライバーによって変更されるべきではありません |
|
警告 C28146: カーネルモードドライバーは、strsafe.hではなく ntstrsafe.hを使用する必要があります。 ソースファイル内に見つかりました |
|
警告 C28147: この関数の呼び出しにデフォルトのプール タグ (「kdD」または「mdW」) を使用すると、プールのタグ付けの目的が無効になります。 |
|
警告 C28150: この関数により、IRQレベルが分析対象の関数で許容される最大値よりも高く設定されます。 |
|
警告 C28151: この値は IRQLの有効な値ではありません |
|
警告 C28152: AddDeviceのような関数からの予期せぬ戻り DO_DEVICE_INITIALIZING |
|
警告 C28153: アノテーションからのIRQLの値は、このコンテキストでは評価できませんでした。 |
|
警告 C28156: 実際のIRQLは必要なIRQLと一致しません |
|
警告 C28157: IRQLは復元されませんでした |
|
警告 C28158: IRQLが保存されませんでした |
|
警告 C28161: フローティングハードウェアの使用権を取得せずに終了する |
|
警告 C28162: 浮動小数点ハードウェアを使用する権利を保持したまま終了する |
|
警告 C28165: クラスの関数ポインタが関数クラスと一致しません |
|
警告 C28166: この関数は、IRQLを関数開始時の現在の値に復元しませんが、そうする必要があります。 |
|
警告 C28167: この関数はIRQLを変更しますが、終了する前にIRQLを復元しません。 変更を反映するために注釈を付ける必要があります。そうでない場合は、IRQLを復元する必要があります。 |
|
警告 C28168: ディスパッチ関数には、このディスパッチ テーブル エントリに一致するDispatch_type注釈がありません。 |
|
警告 C28169: ディスパッチ関数にはDispatch_type 注釈がありません。 |
|
警告C28170: 関数はページング セグメント内にあると宣言されていますが、PAGED_CODE も PAGED_CODE_LOCKED も見つかりませんでした |
|
警告 C28171: この関数には、PAGED_CODE または PAGED_CODE_LOCKED のインスタンスが複数存在します |
|
警告 C28172: 関数に PAGED_CODE または PAGED_CODE_LOCKED が存在しますが、ページング セグメント内にあると宣言されていません |
|
警告 C28173: 現在の関数は、4 GB を超える物理メモリに誤って適応しているようです |
|
警告 C28175: この構造体メンバーには、ドライバーからアクセスできません |
|
警告 C28176: この構造体メンバーをドライバーが変更することはできません |
|
警告 C28177: 関数の注釈に、複数の関数クラスが記述されています。 1 つ以外はすべて無視されます。 |
|
警告 C28260: 関数内のプロパティの解析中に注釈の構文エラーが見つかりました |
|
関数のプロパティについて、注釈での構文エラーが見つかりました。 |
|
警告 C28268: 関数の関数クラスが、ここで使用されている typedef の関数クラスと一致しません |
|
警告 C28601: HWND_BROADCAST でのブロックを回避してください |
|
警告 C28602: HWND_BROADCAST を指定して SendMessageTimeout を呼び出さないでください |
|
警告 C28604: タイムアウト 0 で SMTO_ABORTIFHUNG を指定して SendMessageTimeout を呼び出さないでください |
|
警告 C28615: __try ブロックで _alloca を呼び出す際には、__except() ブロック内で _resetstkoflw を呼び出す必要があります。 catch() ブロック内から _resetstkoflw を呼び出さないでください |
|
警告 C28616: マルチスレッド化された AV 条件。 |
|
警告 C28617: _beginthread() の戻り値を使用しないでください。 代わりに _beginthreadex() を使用してください |
|
警告 C28623: GetMessagePos() の座標の符号なしキャスト。 LOWORD/HIWORD の代わりに GET_X_LPARAM/GET_Y_LPARAM を使用してください |
|
警告 C28624: LResultFromObject からインクリメントされた参照カウントに一致する Release() の呼び出しがありません |
|
警告 C28625: 機密データを消去するために使用される関数呼び出しは、最適化されます |
|
警告 C28636: GetSecurityDescriptorOwner/Group/Dacl/Sacl の呼び出しから取得された、割り当てられていないポインターに対する LocalFree の呼び出し |
|
警告 C28637: グローバル初期化子内での関数呼び出しは安全ではありません |
|
警告 C28638: 関数の遅延読み込みスタブに一致する宣言がありません |
|
警告 C28639: 文字列を使用して CloseHandle を呼び出しています |
|
警告 C28640: 関数の遅延読み込みスタブは静的関数である必要があります |
|
警告 C28644: DPA_InsertPtr からの戻り値がチェックされていません |
|
警告 C28645 推奨されなくなった疑問符メッセージ記号を使用して、MessageBox が呼び出されました |
|
警告 C28648: PulseEvent は信頼性の低い関数です |
|
警告 C28649: 自動またはグローバル スタック配列が NULL になることはありません |
|
警告 C28650: !0 が使用されている型は、エラー ケースとして扱われません。 !TRUE などの状態値を返すことは、エラーを示す状態値を返すことと同じではありません。 |
|
警告 C28651: メンバー関数ポインターが原因で、静的初期化子によるページのコピーオンライトが発生します |
|
警告 C28652: 静的初期化子では、ビット演算子がオーバーロードされているため、書き込みページ ページでコピーが発生する |
|
警告 C28714: 意味的に異なる整数型間でキャストする |
|
警告 C28715: 意味的に異なる整数型間でキャストする |
|
警告 C28716: 意味的に異なる整数型間のコンパイラ挿入キャスト |
|
警告 C28717: 無効な VARIANT 型 |
|
警告 C28718: 注釈なしバッファー |
|
警告 C28719: 禁止されている API の使用 |
|
警告 C28720: 禁止されている API の使用 |
|
警告 C28721: 非推奨のパフォーマンス カウンター アーキテクチャ |
|
警告 C28722: 関数宣言の注釈なしバッファー |
|
警告 C28723: 対応する宣言がない関数定義の注釈なしバッファー |
|
警告 C28725: SetUnhandledExceptionFilter ではなく Watson を使用する |
|
警告 C28726: 禁止されている API の使用 |
|
警告 C28727: 禁止されている API の使用 |
|
警告 C28728: 禁止されている API の使用 |
|
警告 C28730 ポインターに '\\0' を直接割り当てられる可能性。 |
|
警告 C28735: 禁止されている Crimson API の使用 |
|
警告 C28736: 禁止されている API 引数の使用 |
|
警告 C28740: 注釈なし符号なしバッファー |
|
警告 C28741: 関数の注釈なしバッファー |
|
警告 C28742: 関数の注釈なしバッファー |
|
警告 C28750 lstrlen とそのバリアントの使用が禁止されています。 |
|
警告 C28751 ExAllocatePool とそのバリアントの使用が禁止されています。 |
|
警告 C28752: kernel32 または advapi32 API の使用が禁止されている |
|
警告 C28753: パラメーターが未定義の評価順序に依存している |
|
警告 C30029: 実行可能メモリを要求するメモリ割り当て関数を呼び出しています。 |
|
警告 C30030: メモリ割り当て関数を呼び出し、実行可能なメモリを示すパラメーターを渡す |
|
警告 C30031: メモリ割り当て関数を呼び出し、実行可能なメモリを示すパラメーターを渡す |
|
警告 C30032: メモリ割り当て関数を呼び出し、POOL_NX_OPTOUT ディレクティブを使用して実行可能なメモリの要求を強制する |
|
警告 C30033: Executable allocation was detected in a driver compiled with POOL_NX_OPTIN でコンパイルされたドライバーで実行可能ファイルの割り当てが検出された このドライバーは、実行時に別のドライバーによって読み込まれると判断されました。 読み込み中のドライバーが、DriverEntry で ExInitializeDriverRuntime(DrvRtPoolNxOptIn) を呼び出すことを確認してください。 |
|
警告 C30034: 実行可能メモリが割り当てられる可能性がある割り当て関数にフラグ値を渡します。 割り当て関数が、実行可能な非ページ プールの形式を要求していないかどうかを確認してください。 |
|
警告 C30035: 初期化関数 (DriverEntry() や DllInitialize() など) 内から行う必要がある関数に対して呼び出しが行われました。 PREfast は、初期化関数から呼び出しが行われたかどうかを判断できませんでした。 |