驱动程序的代码分析概述

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

代码分析工具的工作原理

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

当截获编译器运行时,Code Analysis for 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 应与 WDK 一起使用,以便Windows 8。 如果需要有关适用于驱动程序的 SAL 1.0 的信息,请参阅适用于 Windows 7 的 WDK 附带的驱动程序注释的 PREfast 文档。

解释结果

驱动程序代码分析易于运行,运行速度很快,即使在非常大的驱动程序和程序上也是如此。 开发人员的工作是检查输出、分析代码分析工具检测到的错误,以及将实际编码错误与代码分析工具错误解释的有效代码区分开来。

有关描述代码分析工具可能检测到的每个警告的综合参考,请参阅 驱动程序警告的代码分析。 有关 Visual Studio 中的代码分析工具报告的核心警告集的信息,请参阅 代码分析警告

解决代码分析警告通常涉及在适当时更新源代码,或添加注释来阐明函数协定。 添加批注可让分析器对所有未来的调用方强制实施协定,同时提高可读性。

如果 代码分析结果 显示经过仔细检查后确定的错误无效,并且即使使用注释也无法避免,则可以选择排除或禁止这些警告。 有关详细信息,请参阅 如何为驱动程序运行代码分析

如何为驱动程序运行“代码分析”

Visual Studio 中的代码分析工具

驱动程序的代码分析警告

代码分析警告

Windows 驱动程序的 SAL 2.0 注释