驅動程式的程式代碼分析概觀

Windows 驅動程式套件提供 Visual Studio Microsoft程式代碼分析工具驅動程式特定擴充功能。 驅動程式的程式代碼分析包含僅適用於驅動程式的規則,特別是內核模式驅動程式。 驅動程式的程式代碼分析可以在程式代碼編譯后立即偵測程式代碼中的潛在錯誤。

重要

驅動程式的程式代碼分析可在 Windows 24H2 WDK 和 EWDK 中使用,但建議您在未來日期將淘汰。
接下來,CodeQL 將是驅動程式的主要靜態分析工具。 CodeQL 提供功能強大的查詢語言,會將程式代碼視為要查詢的資料庫,讓您輕鬆地撰寫查詢特定行為、模式等等。 如需使用 CodeQL 的詳細資訊,請參閱 CodeQL 和靜態工具標誌測試

程式代碼分析工具的運作方式

程序代碼分析工具會攔截建置公用程式對標準編譯程式的呼叫,Cl.exe,並改為執行CL攔截編譯程式,以分析驅動程式碼代碼,並建立錯誤和警告訊息的記錄檔。 您可以自行執行程式碼分析工具,也可以設定程式碼分析工具在建置驅動程式時執行。 當您自行執行程式代碼分析工具 (分析 > 方案上的執行程式代碼分析) 時,結果會出現在 [程序代碼分析報表] 視窗中。 當您在組建中執行程式代碼分析工具時,CL 攔截編譯程式會建立錯誤和警告訊息的記錄檔,然後呼叫標準版本的 Cl.exe 來產生組建輸出。 產生的物件檔案與標準建置命令所產生的物件檔案相同。

攔截編譯程式執行時,驅動程式的程式代碼分析會獨立檢查程式代碼中的每個函式,然後透過程式代碼模擬所有可能路徑的執行,尋找常見的驅動程序錯誤和不明智的編碼作法。 程式代碼分析工具會以相對快速的速度執行,即使是在較大的驅動程式上,其所產生的報告也會以可疑的錯誤精確識別驅動程式程式代碼行。

錯誤程式代碼分析可以偵測到的類型

程式代碼分析可以偵測數種類型的錯誤,包括下列類別中的錯誤:

  • 記憶體: 潛在的記憶體流失、取值 NULL 指標、存取未初始化的記憶體、過度使用內核模式堆疊,以及不當使用集區卷標。

  • 資源: 無法釋放資源,例如鎖定、呼叫某些函式時應保留的資源,以及呼叫其他函式時不應保留的資源。

  • 函式使用: 可能不正確使用某些函式、出現不正確的函式自變數、不嚴格檢查類型的函式可能自變數類型不符、可能使用某些過時函式,以及可能不正確的 IRQL 函數調用。

  • 浮點狀態: 無法保護驅動程式中的浮點硬體狀態,並在將浮點狀態儲存在不同的 IRQL 后嘗試還原浮點狀態。

  • 優先順序規則: 由於 C 程式設計的優先順序規則,可能無法如程式設計人員所預期般運作的程式碼。

  • 核心模式編碼做法: 可能導致錯誤的程式代碼撰寫做法,例如修改不透明的記憶體描述元清單 (MDL) 結構、無法檢查所呼叫函式所設定的變數值,以及使用 C/C++ 字串操作函式,而不是 Ntstrsafe.h 中定義的安全字串函式。

  • 驅動程式特定的程式代碼撰寫做法: 在內核模式驅動程式中通常是錯誤來源的特定作業。 例如,複製整個 I/O 要求封包 (IRP),而不修改成員,並將指標儲存至字串或結構自變數,而不是複製 DriverEntry 例程中的自變數。

程序代碼分析警告

程式代碼分析工具會使用以規則為基礎的模型來識別程式代碼或驅動程式程式代碼中的錯誤。 如果程式代碼分析工具偵測到違反規則,則每個規則都會與回報的警告相關聯。 如需驅動程式特定警告的詳細資訊,請參閱 驅動程式警告的程式代碼分析。 如需 Visual Studio 中程式代碼分析工具所報告之一組核心警告的相關信息,請參閱 程式碼分析警告

註釋

程序代碼分析工具提供的重要功能之一,就是在驅動程式的原始碼中標註函式描述和其他一些實體。 程式代碼分析工具具有功能內部範圍;也就是說,它會分析函式之間的互動。 批注的目標是在呼叫的函式與呼叫函式之間提供更完整的合約表示式,讓程式代碼分析工具可以檢查合約是否相符。 註釋的另一個目標是,他們會通知誰閱讀程式代碼應該如何使用函式,以及預期的結果。 批注會宣告 介面的合約,而且不會嘗試描述該合約的達成方式。 在許多情況下,執行程式代碼分析工具的結果會反映缺少適當的批註,並藉由新增批註來隱藏有關遺漏註釋的警告,並啟用其他檢查。 如需詳細資訊,請參閱 適用於 Windows 驅動程式的 SAL 2.0 註釋。 有關 SAL 2.0 的詳細資訊,請參閱 使用 SAL 註釋減少 C/C++程式代碼缺失。 SAL 2.0 取代 SAL 1.0。 SAL 2.0 應該與適用於 Windows 8 的 WDK 搭配使用。 如果您需要有關驅動程式 SAL 1.0 的資訊,請參閱 Windows 7 WDK 隨附的驅動程式註釋檔 PREfast。

解譯結果

驅動程式的程式代碼分析很容易執行,而且即使在非常大的驅動程式和程式上也能快速執行。 開發人員的工作是檢查輸出、分析程式碼分析工具偵測到的錯誤,以及區分程式代碼分析工具誤譯之有效程式碼的實際程式碼錯誤。

如需描述程式代碼分析工具可能偵測到之每個警告的完整參考,請參閱 驅動程式警告的程式代碼分析。 如需 Visual Studio 中程式代碼分析工具所報告之一組核心警告的相關信息,請參閱 程式碼分析警告

解決程式代碼分析警告通常牽涉到適當時更新原始程式碼,或新增註釋來釐清函式合約。 新增註釋可讓分析器強制執行所有未來呼叫端的合約,同時也可改善可讀性。

如果程式 代碼分析結果 顯示您判斷的錯誤,在仔細檢查之後無效,即使使用註釋,也無法避免,您可以選擇排除或隱藏這些警告。 如需詳細資訊,請參閱 如何執行驅動程式的程式代碼分析。

如何執行驅動程式的程式代碼分析

Visual Studio 中的程式碼分析工具

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

程序代碼分析警告

適用於 Windows 驅動程式的 SAL 2.0 註釋