驅動程式程式碼分析警告

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

驅動程式的程式碼分析會報告下列類型的警告:

  • 一般警告 (6000-6999) :C 和 C++ 語法中的潛在錯誤,以及一般程式碼撰寫做法。 如需這些警告的描述,請參閱 C/C++ 警告的程式碼分析

  • Windows 特定警告 (28600-28799) :這些警告是 Windows 中特定使用模式的特定警告,但不是驅動程式特有的。

  • 驅動程式特定警告 (28100-28199) :驅動程式與應用程式互動、其他驅動程式和作業系統時發生錯誤。

  • 注釋錯誤 (28200-28299 和 36000-36999) :這些警告表示批註在不正確的內容中未正確編碼或使用。 在大部分情況下,這類警告的存在表示批註沒有所需的 (或任何) 效果。

  • 記憶體配置警告 (30029-30035) :這些是記憶體配置警告。

本節內容

主題 描述

C28101

警告 C28101:Drivers 模組已推斷目前的函式不是正確的函式類型

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

warning C28177:函式會加上多個函式類別的批註。 除了一個,將會忽略。

C28260

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

C28266

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

C28268

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

C28601

警告 C28601:避免封鎖HWND_BROADCAST

C28602

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

C28604

警告 C28604:避免呼叫具有逾時SMTO_ABORTIFHUNG的 SendMessageTimeout

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 控制碼

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:禁用 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:在以 POOL_NX_OPTIN編譯的驅動程式中偵測到可執行配置。 此驅動程式已由另一個驅動程式決定在執行時間載入。 請確認載入驅動程式在其 DriverEntry 中呼叫 ExInitializeDriverRuntime (DrvRtPoolNxOptIn)

C30034

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

C30035

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