ドライバーの Code Analysis の警告

このセクションでは、ドライバー コードに潜在的なエラーが検出されたときに、ドライバーのコード分析が報告する警告の一覧と説明を示します。 一部の警告はカーネル モード コードを対象としており、ユーザー モード ドライバーを分析するときに無視できることに注意してください。

ドライバーのコード分析では、次の種類の警告が報告されます。

  • 一般的な警告 (6000 から 6999): C および C++ 構文および一般的なコーディング方法でエラーが発生する可能性があります。 これらの警告の詳細については、「C/C++ 警告のコード分析」を参照してください。

  • Windows 固有の警告 (28600-28799): これらの警告は、Windows での特定の使用パターンに固有のものですが、ドライバーに固有ではありません。

  • ドライバー固有の警告 (28100-28199): アプリケーション、他のドライバー、およびオペレーティング システムとドライバーとの相互作用におけるエラー。

  • 注釈エラー (28200-28299 および 36000-36999): これらの警告は、注釈が誤ってコード化されたか、不適切なコンテキストで使用されたことを示します。 たいていの場合、このような警告が表示されるのは、注釈が期待どおりに(あるいはまったく)効果を発揮していないことを示しています。

  • メモリ割り当ての警告 (30029-30035): メモリ割り当ての警告です。

このセクションの内容

トピック 説明

C28101

警告 C28101: ドライバーモジュールは、現在の関数が正しいタイプの関数ではないと推論しました。

C28110

警告 C28110: ドライバーは浮動小数点ハードウェア状態を保護する必要があります。 float の使用法を参照

C28111

警告 C28111: 浮動小数点状態が保存されたIRQL は、現在のIRQL(この復元操作の場合) と一致しません。

C28114

警告:C28114: IRPスタックエントリ全体をコピーすると、クリアまたは更新する必要がある特定のフィールドが初期化されたままになります。

C28120

警告 C28120: この関数は、現在のIRQレベルでは呼び出すことができません。 現在のレベルが低すぎます。

C28121

警告 C28121: この関数は、現在のIRQレベルでは呼び出すことができません。 現在のレベルが高すぎます。

C28122

警告 C28122: この関数は、低い IRQ レベルで呼び出すことは許可されていません。 以前の関数呼び出しはこの制約と矛盾します。

C28123

警告 C28123: この関数を高いIRQレベルで呼び出すことは許可されていません。 以前の関数呼び出しはこの制約と矛盾します。

C28124

警告 C28124: を呼び出すと、IRQレベルが分析対象の関数に許容される最小値よりも低く設定されます。

C28126

警告 C28126: ObReferenceObject* の AccessModeパラメータは IRP->RequestorModeである必要があります

C28127

警告 C28127: ルーチンとして使用されている関数は、予期される型と正確に一致しません。

C28128

警告 C28128: フィールドへの直接アクセスが行われました。 それはルーチンで作られるべきです。

C28129

警告 C28129: オペランドへの割り当てが行われています。ビットのセットとクリアを使用してのみ変更する必要があります。

C28131

警告 C28131: マネージャがバッファを解放するため、DriverEntry ルーチンはポインタではなく引数のコピーを保存する必要があります。

C28132

警告 C28132: ポインタのサイズを取得します

C28133

警告 C28133: IoInitializeTimerはAddDeviceから呼び出すのが最適です

C28134

警告 C28134: プールタグの型は文字列や文字列ポインタではなく、整数である必要があります。

C28135

警告 C28135: KeWaitForSingleObjectの最初の引数がローカル変数の場合、Modeパラメータは KernelModeである必要があります。

C28139

警告 C28139: 引数は型と正確に一致する必要があります

C28141

警告 C28141: この引数により、IRQレベルが現在のIRQLよりも低く設定されるため、この関数はその目的には使用できません

C28143

警告 C28143: IoMarkIrpPendingを呼び出すディスパッチ ルーチンも STATUS_PENDING を返す必要があります

C28144

警告 C28144: キャンセルルーチン内では、終了時点で、Irp->CancelIrqlのIRQLが現在のIRQLである必要があります。

C28145

警告 C28145: 不透明なMDL構造はドライバーによって変更されるべきではありません

C28146

警告 C28146: カーネルモードドライバーは、strsafe.hではなく ntstrsafe.hを使用する必要があります。 ソースファイル内に見つかりました

C28147

警告 C28147: この関数の呼び出しにデフォルトのプール タグ (「kdD」または「mdW」) を使用すると、プールのタグ付けの目的が無効になります。

C28150

警告 C28150: この関数により、IRQレベルが分析対象の関数で許容される最大値よりも高く設定されます。

C28151

警告 C28151: この値は IRQLの有効な値ではありません

C28152

警告 C28152: AddDeviceのような関数からの予期せぬ戻り DO_DEVICE_INITIALIZING

C28153

警告 C28153: アノテーションからのIRQLの値は、このコンテキストでは評価できませんでした。

C28156

警告 C28156: 実際のIRQLは必要なIRQLと一致しません

C28157

警告 C28157: IRQLは復元されませんでした

C28158

警告 C28158: IRQLが保存されませんでした

C28161

警告 C28161: フローティングハードウェアの使用権を取得せずに終了する

C28162

警告 C28162: 浮動小数点ハードウェアを使用する権利を保持したまま終了する

C28165

警告 C28165: クラスの関数ポインタが関数クラスと一致しません

C28166

警告 C28166: この関数は、IRQLを関数開始時の現在の値に復元しませんが、そうする必要があります。

C28167

警告 C28167: この関数はIRQLを変更しますが、終了する前にIRQLを復元しません。 変更を反映するために注釈を付ける必要があります。そうでない場合は、IRQLを復元する必要があります。

C28168

警告 C28168: ディスパッチ関数には、このディスパッチ テーブル エントリに一致するDispatch_type注釈がありません。

C28169

警告 C28169: ディスパッチ関数にはDispatch_type 注釈がありません。

C28170

警告C28170: 関数はページング セグメント内にあると宣言されていますが、PAGED_CODE も PAGED_CODE_LOCKED も見つかりませんでした

C28171

警告 C28171: この関数には、PAGED_CODE または PAGED_CODE_LOCKED のインスタンスが複数存在します

C28172

警告 C28172: 関数に PAGED_CODE または PAGED_CODE_LOCKED が存在しますが、ページング セグメント内にあると宣言されていません

C28173

警告 C28173: 現在の関数は、4 GB を超える物理メモリに誤って適応しているようです

C28175

警告 C28175: この構造体メンバーには、ドライバーからアクセスできません

C28176

警告 C28176: この構造体メンバーをドライバーが変更することはできません

C28177

警告 C28177: 関数の注釈に、複数の関数クラスが記述されています。 1 つ以外はすべて無視されます。

C28260

警告 C28260: 関数内のプロパティの解析中に注釈の構文エラーが見つかりました

C28266

関数のプロパティについて、注釈での構文エラーが見つかりました。

C28268

警告 C28268: 関数の関数クラスが、ここで使用されている typedef の関数クラスと一致しません

C28601

警告 C28601: HWND_BROADCAST でのブロックを回避してください

C28602

警告 C28602: HWND_BROADCAST を指定して SendMessageTimeout を呼び出さないでください

C28604

警告 C28604: タイムアウト 0 で SMTO_ABORTIFHUNG を指定して SendMessageTimeout を呼び出さないでください

C28615

警告 C28615: __try ブロックで _alloca を呼び出す際には、__except() ブロック内で _resetstkoflw を呼び出す必要があります。 catch() ブロック内から _resetstkoflw を呼び出さないでください

C28616

警告 C28616: マルチスレッド化された AV 条件。

C28617

警告 C28617: _beginthread() の戻り値を使用しないでください。 代わりに _beginthreadex() を使用してください

C28623

警告 C28623: GetMessagePos() の座標の符号なしキャスト。 LOWORD/HIWORD の代わりに GET_X_LPARAM/GET_Y_LPARAM を使用してください

C28624

警告 C28624: LResultFromObject からインクリメントされた参照カウントに一致する Release() の呼び出しがありません

C28625

警告 C28625: 機密データを消去するために使用される関数呼び出しは、最適化されます

C28636

警告 C28636: GetSecurityDescriptorOwner/Group/Dacl/Sacl の呼び出しから取得された、割り当てられていないポインターに対する LocalFree の呼び出し

C28637

警告 C28637: グローバル初期化子内での関数呼び出しは安全ではありません

C28638

警告 C28638: 関数の遅延読み込みスタブに一致する宣言がありません

C28639

警告 C28639: 文字列を使用して CloseHandle を呼び出しています

C28640

警告 C28640: 関数の遅延読み込みスタブは静的関数である必要があります

C28644

警告 C28644: DPA_InsertPtr からの戻り値がチェックされていません

C28645

警告 C28645 推奨されなくなった疑問符メッセージ記号を使用して、MessageBox が呼び出されました

C28648

警告 C28648: PulseEvent は信頼性の低い関数です

C28649

警告 C28649: 自動またはグローバル スタック配列が NULL になることはありません

C28650

警告 C28650: !0 が使用されている型は、エラー ケースとして扱われません。

!TRUE などの状態値を返すことは、エラーを示す状態値を返すことと同じではありません。

C28651

警告 C28651: メンバー関数ポインターが原因で、静的初期化子によるページのコピーオンライトが発生します

C28652

警告 C28652: 静的初期化子では、ビット演算子がオーバーロードされているため、書き込みページ ページでコピーが発生する

C28714

警告 C28714: 意味的に異なる整数型間でキャストする

C28715

警告 C28715: 意味的に異なる整数型間でキャストする

C28716

警告 C28716: 意味的に異なる整数型間のコンパイラ挿入キャスト

C28717

警告 C28717: 無効な VARIANT 型

C28718

警告 C28718: 注釈なしバッファー

C28719

警告 C28719: 禁止されている API の使用

C28720

警告 C28720: 禁止されている API の使用

C28721

警告 C28721: 非推奨のパフォーマンス カウンター アーキテクチャ

C28722

警告 C28722: 関数宣言の注釈なしバッファー

C28723

警告 C28723: 対応する宣言がない関数定義の注釈なしバッファー

C28725

警告 C28725: SetUnhandledExceptionFilter ではなく Watson を使用する

C28726(日本未発売)

警告 C28726: 禁止されている API の使用

C28727

警告 C28727: 禁止されている API の使用

C28728

警告 C28728: 禁止されている API の使用

C28730

警告 C28730 ポインターに '\\0' を直接割り当てられる可能性。

C28735

警告 C28735: 禁止されている Crimson API の使用

C28736

警告 C28736: 禁止されている API 引数の使用

C28740

警告 C28740: 注釈なし符号なしバッファー

C28741

警告 C28741: 関数の注釈なしバッファー

C28742

警告 C28742: 関数の注釈なしバッファー

C28750

警告 C28750 lstrlen とそのバリアントの使用が禁止されています。

C28751

警告 C28751 ExAllocatePool とそのバリアントの使用が禁止されています。

C28752

警告 C28752: kernel32 または advapi32 API の使用が禁止されている

C28753

警告 C28753: パラメーターが未定義の評価順序に依存している

C30029

警告 C30029: 実行可能メモリを要求するメモリ割り当て関数を呼び出しています。

C30030

警告 C30030: メモリ割り当て関数を呼び出し、実行可能なメモリを示すパラメーターを渡す

C30031

警告 C30031: メモリ割り当て関数を呼び出し、実行可能なメモリを示すパラメーターを渡す

C30032

警告 C30032: メモリ割り当て関数を呼び出し、POOL_NX_OPTOUT ディレクティブを使用して実行可能なメモリの要求を強制する

C30033

警告 C30033: Executable allocation was detected in a driver compiled with POOL_NX_OPTIN でコンパイルされたドライバーで実行可能ファイルの割り当てが検出された このドライバーは、実行時に別のドライバーによって読み込まれると判断されました。 読み込み中のドライバーが、DriverEntry で ExInitializeDriverRuntime(DrvRtPoolNxOptIn) を呼び出すことを確認してください。

C30034

警告 C30034: 実行可能メモリが割り当てられる可能性がある割り当て関数にフラグ値を渡します。 割り当て関数が、実行可能な非ページ プールの形式を要求していないかどうかを確認してください。

C30035

警告 C30035: 初期化関数 (DriverEntry()DllInitialize() など) 内から行う必要がある関数に対して呼び出しが行われました。 PREfast は、初期化関数から呼び出しが行われたかどうかを判断できませんでした。