定义查询结果¶
您可以通过修改查询的 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 语句有两列
- 一个带有位置的元素,用于显示警报:
c
对应于Class
。 - 要显示的字符串消息:
"This class extends another class."

包括超类的名称¶
由基本 select 语句定义的警报消息是恒定的,并没有向用户提供太多信息。由于查询标识了超类,因此可以轻松地将超类的名称包含在字符串消息中。例如
select c, "This class extends the class " + superclass.getName()
- 元素:
c
与以前一样。 - 字符串消息:
"This class extends the class "
——字符串文本与superclass
的类名组合在一起,由getName()
返回。

虽然这比原始的 select 语句更具信息量,但用户仍然需要手动查找超类。
添加指向超类的链接¶
您可以在警报消息的文本中使用占位符来插入其他信息,例如指向超类的链接。占位符使用 $@
定义,并使用 select 语句中接下来的两列中的信息填充。例如,此 select 语句返回四列
select c, "This class extends the class $@.", superclass, superclass.getName()
- 元素:
c
与以前一样。 - 字符串消息:
"This class extends the class $@."
——字符串文本现在包含一个占位符,它将显示接下来的两列的组合内容。 - 占位符的元素:
superclass
。 - 占位符的字符串文本:由
superclass.getBaseName()
返回的类名。
当显示警报消息时,$@
占位符将被使用 select
语句定义的第三列和第四列的内容创建的链接替换。在此示例中,链接目标将是超类定义的位置,链接文本将是其名称。请注意,某些超类(例如 Object
)将不在数据库中,因为它们是内置于 Java 语言中的。单击这些链接将没有效果。
如果您在描述文本中多次使用 $@
占位符标记,那么第 N
次使用将被使用列 2N+2
和 2N+3
形成的链接替换。如果额外的列对多于占位符标记的数量,则忽略尾随列。相反,如果额外的列对少于占位符标记的数量,则尾随标记将被视为普通文本,而不是占位符标记。
