驱动程序的代码分析概述

Windows 驱动程序工具包在 Microsoft Visual Studio 中为代码分析工具提供特定于驱动程序的扩展。 驱动程序的代码分析包括仅适用于驱动程序的规则,尤其是内核模式驱动程序。 代码分析驱动程序可以在代码编译后立即检测代码中的潜在错误。

重要

驱动程序的代码分析在 Windows 24H2 WDK 和 EWDK 中可用,但建议它在将来的日期停用。
今后,CodeQL 将成为驱动程序的主要静态分析工具。 CodeQL 提供了一种功能强大的查询语言,可将代码视为要查询的数据库,使编写特定行为、模式等查询变得简单。 有关使用 CodeQL 的详细信息,请参阅 CodeQL 和静态工具徽标测试

代码分析工具的工作原理

代码分析工具截获生成实用工具对标准编译器的调用,Cl.exe,而是运行 CL 拦截编译器,该编译器分析驱动程序源代码并创建错误和警告消息的日志文件。 可以单独运行代码分析工具,也可以将代码分析工具配置为在生成驱动程序时运行。 当你自行运行代码分析工具(分析 > 解决方案上的运行代码分析)时,结果将显示在“代码分析报告”窗口中。 在生成过程中运行代码分析工具时,CL 截获编译器会创建错误和警告消息的日志文件,然后调用标准版本的 Cl.exe 以生成生成输出。 生成的对象文件与标准生成命令生成的对象文件相同。

截获编译器运行时,Drivers 的代码分析会独立检查代码中的每个函数,然后模拟通过代码执行所有可能的路径,查找常见的驱动程序错误和不明智的编码做法。 代码分析工具运行速度相对较快,即使在较大的驱动程序上运行,它生成的报表也精确标识了具有可疑错误的驱动程序代码行。

代码分析可以检测的错误类型

代码分析可以检测多种错误,包括以下类别中的错误:

  • 内存: 潜在的内存泄漏、取消引用 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 注释