驱动程序代码分析概述

Windows 驱动程序工具包 (WDK) 为 Microsoft Visual Studio Ultimate 2012 中的代码分析工具提供了一种特定于驱动程序的扩展。驱动程序代码分析包括仅适用于驱动程序(特别是内核模式驱动程序)的规则。驱动程序代码分析在代码可编译后立即检测代码中的潜在错误。

代码分析工具的工作原理

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

当截获编译器运行时,驱动程序代码分析独立检查代码中的每个函数,然后模拟经过代码的所有可能路径的执行,查找常见的驱动程序错误和不合理的编码实践。代码分析工具的运行速度相对较快,甚至在更大的驱动程序上也是如此,它生成的报告准确标识了具有可疑错误的驱动程序代码行。

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

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

  • 内存:潜在的内存泄漏、已取消引用的 NULL 指针,对未初始化内存的访问、对内核模式堆栈的过度使用,以及对池标记的不当使用。

  • 资源:未能释放锁等资源、应在调用某些函数时保留的资源,以及在调用其他函数时不应保留的资源。

  • 函数用法:某些函数潜在的错误使用、看似错误的函数参数、对于没有严格检查类型的函数,可能的参数类型错误匹配、对某些过时函数的可能使用,以及可能在错误的 IRQL 上调用的函数。

  • 浮点状态:未能保护驱动程序中的浮点硬件状态,尝试在不同 IRQL 上保存浮点状态保存后还原它。

  • 优先规则:由于 C 编程的优先规则,代码的行为可能不符合程序员的意图。

  • 内核模式编码实践:可能导致错误的编码实践,例如修改一个不透明的内存描述符列表 (MDL) 结构,未能检查一个调用函数设置的变量值,以及使用 C/C++ 字符串操作函数,而不是 Ntstrsafe.h 中定义的安全字符串函数。

  • 特定于驱动程序的编码实践:一些特定的操作常常是内核模式驱动程序中错误的来源。例如,复制整个 I/O 请求数据包 (IRP) 而不修改成员,以及保存指向一个字符串或结构参数的指针,而不是复制 DriverEntry 例程中的一个参数。

代码分析警告

代码分析工具使用一个基于规则的模型识别程序或驱动程序代码中的错误。每条规则与在代码分析工具检测到违规行为时报告的一个警告相关联。有关特定于驱动程序的警告的详细信息,请参阅驱动程序代码分析警告。有关 Visual Studio Ultimate 2012 中代码分析工具报告的核心警告集的信息,请参阅代码分析警告

注释

代码分析功能提供的一项重要的功能是:注释驱动程序源代码中的函数描述和其他一些实体。代码分析工具有一个函数内作用域;也就是说,它分析函数之间的交互。注释的用途是提供被调用函数和调用函数之间合约的更完整表达,使代码分析工具可检测是否满足该合约的要求。注释的另一个目标是,它们告知读取代码的用户应如何使用该函数和预期会得到何种结果。注释会声明接口的合约,但不会尝试描述如何实现该合约。在许多情况下,运行代码分析工具的结果会反映出缺少一个合适的注释,通过添加注释,有关缺少注释的警告会被隐藏,并且还会启用更多检查。有关详细信息,请参阅用于 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 Ultimate 2012 中代码分析工具报告的核心警告集的信息,请参阅代码分析警告

解决代码分析警告通常涉及到在适当时机更新源代码,或者添加一条注释来澄清函数合约。 添加一条注释允许分析器对所有未来的调用方执行合约,并且还会改进可读性。

如果在仔细检查后,“代码分析结果”显示你检查的错误是无效的,甚至无法通过使用注释来避免,那么可以选择排除或隐藏这些警告。 有关详细信息,请参阅如何运行驱动程序代码分析

相关主题

如何运行驱动程序代码分析
Visual Studio 中的代码分析工具
驱动程序代码分析警告
代码分析警告
用于 Windows 驱动程序的 SAL 2.0 注释

 

 

显示:
© 2015 Microsoft