CodeQL 文档

别名

别名是现有 QL 实体的替代名称。

定义别名后,您可以在当前模块的 命名空间 中使用该新名称来引用该实体。

定义别名

您可以在任何 模块 的主体中定义别名。为此,您应指定

  1. 关键字 moduleclasspredicate,分别为 模块类型非成员谓词 定义别名。
  2. 别名的名称。这应该是该类型实体的有效名称。例如,有效的谓词别名以小写字母开头。
  3. 对 QL 实体的引用。这包括实体的原始名称,以及对于谓词,谓词的元数。

您还可以对别名进行注释。请参阅可用于别名的 注释 列表。

请注意,这些注释适用于别名引入的名称(而不是底层 QL 实体本身)。例如,别名可以对其别名名称具有不同的可见性。

模块别名

使用以下语法为 模块 定义别名

module ModAlias = ModuleName;

例如,如果您创建了一个名为 NewVersion 的新模块,它是 OldVersion 的更新版本,您可以如下弃用 OldVersion 名称

deprecated module OldVersion = NewVersion;

这样,这两个名称都解析为同一个模块,但如果使用 OldVersion 名称,则会显示弃用警告。

类型别名

使用以下语法为 类型 定义别名

class TypeAlias = TypeName;

请注意,class 只是一个关键字。您可以为任何类型定义别名,即 基本类型数据库类型 和用户定义的

例如,您可以使用别名将基本类型 boolean 的名称缩写为 Bool

class Bool = boolean;

或者,要使用 OneTwoThreeLib.qll模块 M 中定义的类 OneTwo,您可以创建一个别名以使用更短的名称 OT

import OneTwoThreeLib

class OT = M::OneTwo;

...

from OT ot
select ot

谓词别名

使用以下语法为 非成员谓词 定义别名

predicate PredAlias = PredicateName/Arity;

这适用于 不带 结果的谓词。

例如,假设您经常使用以下谓词,它计算小于十的正整数的后继

int getSuccessor(int i) {
  result = i + 1 and
  i in [1 .. 9]
}

您可以使用别名将名称缩写为 succ

predicate succ = getSuccessor/1;

作为不带结果的谓词示例,假设您有一个对所有小于十的正整数都成立的谓词

predicate isSmall(int i) {
  i in [1 .. 9]
}

您可以如下为谓词赋予更具描述性的名称

predicate lessThanTen = isSmall/1;

强别名和弱别名

每个别名定义都是 **强** 或 **弱** 的。当且仅当别名定义是带有 注释 final类型别名 定义时,它才是 **强** 的。在 名称解析 期间,允许对同一个模块/类型/谓词的 **弱** 别名定义的别名之间的歧义,但对来自不同 **强** 别名定义的别名之间的歧义是无效的 QL。同样,为了对 参数化模块:ref:`参数化模块签名 <parameterized-module-signatures> 进行应用实例化,对实例化参数的 **弱** 别名定义的别名不会导致单独的实例化,但对实例化参数的 **强** 别名定义的别名则会。

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