驅動程式警告的程式代碼分析
本節列出並描述驅動程式程式代碼分析在偵測驅動程式程式代碼中可能發生錯誤時所報告的警告。 請注意,某些警告適用於內核模式程序代碼,而且在分析使用者模式驅動程式時可以忽略。
重要
驅動程式的程式代碼分析可在 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 例程應該儲存自變數的複本,而不是指標,因為 I/O 管理員會釋放緩衝區 |
|
警告 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:核心模式驅動程序應該使用 ntstrsafe.h,而不是 strsafe.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。 應該標註以反映變更,或應還原 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:函式會加上多個函式類別的批注。 除了一個,全部都會被忽略。 |
|
警告 C28260:在剖析函式內屬性時,發現註釋中的語法錯誤 |
|
在函式中找到 屬性的註釋語法錯誤。 |
|
警告 C28268:函式上的函式類別不符合此處所使用 typedef 上的函式類別 |
|
警告 C28601:避免封鎖HWND_BROADCAST |
|
警告 C28602:避免使用 HWND_BROADCAST 呼叫 SendMessageTimeout |
|
警告 C28604:避免使用SMTO_ABORTIFHUNG呼叫 SendMessageTimeout 且逾時為 0 |
|
警告 C28615:在 __try 區塊中呼叫_alloca時,必須在 __except() 區塊中呼叫 _resetstkoflw。 不要從 catch() 區塊內呼叫_resetstkoflw |
|
警告 C28616:多線程 AV 條件 |
|
警告 C28617:避免使用 _beginthread() 的傳回值。 請改用 _beginthreadex() |
|
警告 C28623:GetMessagePos() 座標的未帶正負號轉換。 使用 GET_X_LPARAM/GET_Y_LPARAM,而不是LOWORD/HIWORD |
|
警告 C28624:無法呼叫 Release() 以符合 LResultFromObject 的遞增 refcount |
|
警告 C28625:用來清除敏感數據的函數調用將會優化 |
|
警告 C28636:在從 GetSecurityDescriptorOwner/Group/Dacl/Sacl 呼叫的非配置指標上呼叫 LocalFree |
|
警告 C28637:在全域初始化表達式中呼叫函式不安全 |
|
警告 C28638:函式延遲載入存根遺漏相符宣告 |
|
警告 C28639:使用字串呼叫 close handle |
|
警告 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:使用 Watson 而不是此 SetUnhandledExceptionFilter |
|
警告 C28726:禁止的 API 使用方式 |
|
警告 C28727:禁止的 API 使用量 |
|
警告 C28728:禁止的 API 使用方式 |
|
警告 C28730:可能將 『\0』 指派給指標。 |
|
警告 C28735:禁止使用深紅 API |
|
警告 C28736:禁用 API 自變數使用方式 |
|
警告 C28740:未批注的未簽署緩衝區 |
|
警告 C28741:函式中的未批注緩衝區 |
|
警告 C28742:函式中的未批注緩衝區 |
|
警告 C28750:禁止使用 lstrlen 及其變體 |
|
警告 C28751:禁止使用 ExAllocatePool 及其變體 |
|
警告 C28752:禁止使用 kernel32 或 advapi32 API |
|
警告 C28753:依賴未定義的參數評估順序 |
|
警告 C30029:呼叫要求可執行記憶體的記憶體配置函式 |
|
警告 C30030:呼叫記憶體配置函式,並傳遞指出可執行記憶體的參數 |
|
警告 C30031:呼叫記憶體配置函式,並傳遞指出可執行記憶體的參數 |
|
警告 C30032:呼叫記憶體配置函式,並使用 POOL_NX_OPTOUT 指示詞強制要求可執行記憶體 |
|
警告 C30033:在以 POOL_NX_OPTIN 編譯的驅動程式中偵測到可執行配置。 此驅動程式已判斷為在另一個驅動程式的運行時間載入。 請確認載入驅動程式在其 DriverEntry 中呼叫 ExInitializeDriverRuntime(DrvRtPoolNxOptIn)。 |
|
警告 C30034:將旗標值傳遞至配置函式,可能會導致配置可執行記憶體。 請確認配置函式未要求可執行檔非分頁集區的形式。 |
|
警告 C30035:對必須在初始化函式內部進行的函式呼叫(例如 DriverEntry() 或 DllInitialize())。 PREfast 無法判斷是否從初始化函式進行呼叫。 |