CodeQL 文档

定义查询结果

您可以通过修改查询的 select 语句来控制分析结果在源代码中的显示方式。

关于查询结果

查询结果中包含的信息由 select 语句控制。开发有用查询的部分过程是使结果清晰易懂,以便其他用户理解。当您在 CodeQL VS Code 扩展 中编写自己的查询时,对可选择的内容没有限制。但是,如果您要使用查询为代码扫描创建警报或使用 CodeQL CLI 生成有效的分析结果,您需要使 select 语句以所需的格式报告结果。您还必须确保查询定义了适当的元数据属性。本主题解释了如何编写 select 语句以生成有用的分析结果。

概述

警报查询必须在其元数据中定义属性 @kind problem。有关更多信息,请参阅“CodeQL 查询的元数据”。在最基本的形式中,select 语句必须选择两列

  • 元素——查询标识的代码元素。这定义了警报的位置。
  • 字符串——为该代码元素显示的描述警报生成原因的消息。

如果您查看一些现有的查询,您会发现它们可以选择额外的元素/字符串对,这些对与消息中的 $@ 占位符标记组合在一起形成链接。例如,解除引用的变量可能为空(Java)或 重复的 switch case(JavaScript)。

注意

本主题中没有包含有关路径查询的 select 语句的深入讨论。但是,您可以像警报查询一样开发 select 语句的字符串列。有关路径查询的更具体信息,请参阅“创建路径查询”。

开发 select 语句

这是一个简单的查询,用于查找扩展其他类的 Java 类。

基本 select 语句

/**
 * @kind problem
 */

import java

from Class c, Class superclass
where superclass = c.getASupertype()
select c, "This class extends another class."

这个基本的 select 语句有两列

  1. 一个带有位置的元素,用于显示警报:c 对应于 Class
  2. 要显示的字符串消息:"This class extends another class."
Results of basic select statement

包括超类的名称

由基本 select 语句定义的警报消息是恒定的,并没有向用户提供太多信息。由于查询标识了超类,因此可以轻松地将超类的名称包含在字符串消息中。例如

select c, "This class extends the class " + superclass.getName()
  1. 元素:c 与以前一样。
  2. 字符串消息:"This class extends the class "——字符串文本与 superclass 的类名组合在一起,由 getName() 返回。
Results of extended select statement

虽然这比原始的 select 语句更具信息量,但用户仍然需要手动查找超类。

进一步阅读

  • ©2025GitHub, Inc.
  • 条款
  • 隐私