共用方式為


驅動程式警告的程式代碼分析

本節列出並描述驅動程式程式代碼分析在偵測驅動程式程式代碼中可能發生錯誤時所報告的警告。 請注意,某些警告適用於內核模式程序代碼,而且在分析使用者模式驅動程式時可以忽略。

重要

驅動程式的程式代碼分析可在 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

警告 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 例程應該儲存自變數的複本,而不是指標,因為 I/O 管理員會釋放緩衝區

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:核心模式驅動程序應該使用 ntstrsafe.h,而不是 strsafe.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。 應該標註以反映變更,或應還原 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:函式會加上多個函式類別的批注。 除了一個,全部都會被忽略。

C28260

警告 C28260:在剖析函式內屬性時,發現註釋中的語法錯誤

C28266

在函式中找到 屬性的註釋語法錯誤。

C28268

警告 C28268:函式上的函式類別不符合此處所使用 typedef 上的函式類別

C28601

警告 C28601:避免封鎖HWND_BROADCAST

C28602

警告 C28602:避免使用 HWND_BROADCAST 呼叫 SendMessageTimeout

C28604

警告 C28604:避免使用SMTO_ABORTIFHUNG呼叫 SendMessageTimeout 且逾時為 0

C28615

警告 C28615:在 __try 區塊中呼叫_alloca時,必須在 __except() 區塊中呼叫 _resetstkoflw。 不要從 catch() 區塊內呼叫_resetstkoflw

C28616

警告 C28616:多線程 AV 條件

C28617

警告 C28617:避免使用 _beginthread() 的傳回值。 請改用 _beginthreadex()

C28623

警告 C28623:GetMessagePos() 座標的未帶正負號轉換。 使用 GET_X_LPARAM/GET_Y_LPARAM,而不是LOWORD/HIWORD

C28624

警告 C28624:無法呼叫 Release() 以符合 LResultFromObject 的遞增 refcount

C28625

警告 C28625:用來清除敏感數據的函數調用將會優化

C28636

警告 C28636:在從 GetSecurityDescriptorOwner/Group/Dacl/Sacl 呼叫的非配置指標上呼叫 LocalFree

C28637

警告 C28637:在全域初始化表達式中呼叫函式不安全

C28638

警告 C28638:函式延遲載入存根遺漏相符宣告

C28639

警告 C28639:使用字串呼叫 close handle

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:使用 Watson 而不是此 SetUnhandledExceptionFilter

C28726

警告 C28726:禁止的 API 使用方式

C28727

警告 C28727:禁止的 API 使用量

C28728

警告 C28728:禁止的 API 使用方式

C28730

警告 C28730:可能將 『\0』 指派給指標。

C28735

警告 C28735:禁止使用深紅 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:在以 POOL_NX_OPTIN 編譯的驅動程式中偵測到可執行配置。 此驅動程式已判斷為在另一個驅動程式的運行時間載入。 請確認載入驅動程式在其 DriverEntry 中呼叫 ExInitializeDriverRuntime(DrvRtPoolNxOptIn)。

C30034

警告 C30034:將旗標值傳遞至配置函式,可能會導致配置可執行記憶體。 請確認配置函式未要求可執行檔非分頁集區的形式。

C30035

警告 C30035:對必須在初始化函式內部進行的函式呼叫(例如 DriverEntry()DllInitialize())。 PREfast 無法判斷是否從初始化函式進行呼叫。