CodeQL 如何分析代码?

已完成

使用 CodeQL 实现代码扫描需要了解该工具如何分析代码。

CodeQL 分析由三个步骤组成:

  1. 通过创建 CodeQL 数据库来准备代码。
  2. 对数据库运行 CodeQL 查询。
  3. 解释查询结果。

本单元将介绍 CodeQL 分析的三个阶段。

数据库创建

为了创建数据库,CodeQL 首先提取代码库中每个源文件的单个关系表示形式。

对于编译的语言,提取的工作原理是监视正常的生成过程。 每次调用编译器来处理源文件时,都会生成该文件的副本,并收集有关源代码的所有相关信息。 这包括有关抽象语法树的语法数据,以及有关名称绑定和类型信息的语义数据。

对于解释型语言,提取程序直接在源代码上运行,解析依赖项以提供代码库的准确表示形式。

CodeQL 支持的每种语言都有一个提取程序,以确保提取过程尽可能准确。 对于多语言代码库,数据库一次生成一种语言。

提取后,分析所需的所有数据(关系数据、复制的源文件和特定语言的数据库架构,该架构指定数据中的相互关系)将导入到一个称为 CodeQL 数据库的单个目录中。

查询执行

创建 CodeQL 数据库后,将对其执行一个或多个查询。 CodeQL 查询是用专门设计的面向对象的查询语言(称为 QL)编写的。

您可以使用 CodeQL for VS Code 扩展或 CodeQL CLI 来运行从 CodeQL 存储库签出的查询,也可以运行您自己编写的自定义查询。

查询结果

最后一步是将查询执行期间生成的结果转换为在源代码上下文中更有意义的形式,这意味着对结果的解释方式将突出查询旨在查找的潜在问题。

CodeQL 查询结果的屏幕截图。

查询包含指示应如何解释结果的元数据属性。 例如,某些查询在代码中的单个位置显示简单消息。 其他查询则显示一系列的位置,这些位置表示数据流或控制流路径中的步骤,查询还包含解释结果重要性的消息。 不解释没有元数据的查询;其结果以表的形式输出,不会显示在源代码中。

解释之后,将输出结果以供代码评审和分类处理。 在适用于 Visual Studio Code 的 CodeQL 中,解释的查询结果自动显示在源代码中。 CodeQL CLI 生成的结果可以输出为多种不同格式,以供不同工具使用。