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

驱动程序的代码分析提供有关源代码中可能存在缺陷的信息。 可以手动运行代码分析,还可以在每个生成中自动运行代码分析。

本主题内容:

重要

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

运行代码分析

手动对驱动程序源代码运行代码分析

  1. 在 Visual Studio 中,选择驱动程序项目文件或解决方案,然后选择要分析的项目配置和平台。
  2. 从“分析”或“生成”菜单中,单击“对解决方案运行代码分析”

在每个生成中自动对驱动程序源代码运行代码分析

  1. 在 Visual Studio 中,右键单击解决方案资源管理器中的驱动程序项目或解决方案,然后单击“属性”。
  2. 在项目的属性对话框中,单击“ 代码分析”。
  3. 在“C/C++属性的代码分析”页中,选择要分析的项目配置和平台(例如 Windows 8 和 Win32)。
  4. 选择“ 在生成时为 C/C++启用代码分析”。
  5. 在“规则集”下,选择 Microsoft驱动程序建议的规则。 这是驱动程序的默认规则集。
  6. “生成 ”菜单中,单击“ 生成解决方案”。

查看代码分析结果

如果在源代码中找到可能的缺陷,“ 代码分析结果 ”窗口将显示代码分析警告号和源文件中发生缺陷的行号。

查看缺陷

  1. “代码分析结果”窗口中,单击行号,并在“代码分析结果”窗口中显示缺陷的说明。

    “代码”窗口显示源代码,并指示存在缺陷的位置。

  2. 若要了解有关特定警告的详细信息,请单击“代码分析结果”窗口中的“警告”。

查看与生成关联的代码分析日志文件

  1. 导航到生成配置和平台的目录(例如 \\Windows7Release\\x64)。
  2. 如果使用建议的规则,将调用 vc.\*codeanalysis.xml日志文件。 如果要为 Windows Server 2012 创建驱动程序,则此文件用于创建驱动程序验证日志。

抑制缺陷报告

在某些情况下,你可能想要禁止显示特定警告消息的报告;例如,如果警告主要是信息性的,并且你知道错误的原因。

禁止显示警告消息

  1. 若要删除报告缺陷的实例,请在“代码分析结果”窗口中选择行号和警告

  2. 在警告的展开说明中,单击“ 操作>抑制消息>在源中”。

    带有禁止说明符的杂注警告指令仅对紧跟 #pragma 警告语句的代码行禁止显示警告。

    #pragma warning(suppress: 6014)
    

更改内核模式驱动程序的警告 C6262 的堆栈使用限制

在用户模式和内核模式代码中,堆栈空间有限,并且未能提交堆栈页会导致堆栈溢出异常。 在内核模式下,高堆栈使用率尤其令人担忧,因为可用的堆栈空间总数仅为 12 KB。 内核模式代码应主动限制堆栈的使用。

如果函数本地使用了超过 1 KB 的堆栈空间,则代码分析工具会发出警告 C6262 。 如果要调查可能占用大量资源的函数,可以自定义或降低 C6262 使用的堆栈阈值限制。 如果降低堆栈阈值限制,则代码分析工具可能会发现更多问题。 然后,可以选择解决这些堆栈使用问题。 例如,可以将阈值降低到 400 字节,以查看其他函数是否正在使用资源。

自定义 C6262 的堆栈大小限制

  1. 在记事本或其他文本编辑器中打开内核模式驱动程序(或组件)的 Visual Studio 项目文件(.vcxproj)。
  2. 为编译器< ClCompile> 添加新的 ItemDefinitionGroup>。<
  3. <添加 PREfastAdditionalOptions> 元素并设置堆栈大小<字节>。 默认值为 stacksize1024
     <ItemDefinitionGroup>
       <ClCompile>


      <!-- Change stack depth for C6262 from 1024 to 400 -->
      <PREfastAdditionalOptions>stacksize400</PREfastAdditionalOptions>

    </ClCompile>
  </ItemDefinitionGroup>
  1. 保存项目文件。 启动 Visual Studio,加载更新的驱动程序项目,并运行代码分析。

    若要还原为默认值 1 KB,请撤消对项目文件所做的更改,或者将堆栈大小值更改为 stacksize1024

驱动程序代码分析警告