跳至主要内容

查询运行

运行单个查询。

谁可以使用此功能?

CodeQL 可用于以下类型的代码库

本文内容

此内容描述的是 CodeQL CLI 的最新版本。有关此版本的更多信息,请参阅 https://github.com/github/codeql-cli-binaries/releases

要在较早的版本中查看此命令可用的选项的详细信息,请在终端中使用 --help 选项运行该命令。

概要

Shell
codeql query run (--database=<database> | --dataset=<dataset>) [--output=<file.bqrs>] [--threads=<num>] [--ram=<MB>] <options>... -- <file.ql>

描述

运行单个查询。

此命令对 CodeQL 数据库或原始 QL 数据集运行单个查询。

默认情况下,查询结果将以用户友好的方式在终端上显示。如果您想进一步处理结果,我们强烈建议您使用 --output 选项将结果写入中间二进制格式的文件,然后可以使用 codeql bqrs decode 将其解包成各种更适合机器的表示形式。

如果您的查询以可以解释为源代码警报的形式生成结果,您可能会发现 codeql database analyze 是一种更方便的运行方式。特别是,codeql database analyze 可以生成 SARIF 格式的输出,该格式可以与各种警报查看器一起使用。

要并行运行多个查询,请参阅 codeql database run-queries

选项

主要选项

<file.ql>

[必填] 要执行的查询的 QL 源代码。

-o, --output=<file.bqrs>

一个文件,查询的输出将以 BQRS 格式写入。

选择查询内容的选项

必须提供以下选项中的一个。

-d, --database=<database>

要查询的 CodeQL 数据库的路径。

--dataset=<dataset>

[高级] 要查询的原始 QL 数据集的路径。

控制查询评估器的选项

--[no-]tuple-counting

[高级] 在查询评估器日志中显示每个评估步骤的元组计数。如果提供了 --evaluator-log 选项,则元组计数将包含在命令生成的基于文本和结构化 JSON 日志中。(这对于复杂 QL 代码的性能优化很有用)。

--timeout=<seconds>

[高级] 设置查询评估的超时长度(以秒为单位)。

超时功能旨在捕获复杂查询评估需要“无限”时间的情况。它不是限制查询评估总时间的有效方法。只要计算的每个单独计时部分都在超时时间内完成,评估就可以继续进行。目前,这些单独计时的部分是优化查询的“RA 层”,但这在将来可能会改变。

如果没有指定超时时间,或设置为 0,则不会设置超时时间(codeql test run 除外,其默认超时时间为 5 分钟)。

-j, --threads=<num>

使用这么多线程来评估查询。

默认为 1。您可以传递 0 来为机器上的每个核心使用一个线程,或者 -N 来保留 N 个核心未使用(但仍然至少使用一个线程)。

--[no-]save-cache

[高级] 积极地将中间结果写入磁盘缓存。这需要更多时间并使用(更多)磁盘空间,但可能会加快随后执行类似查询的速度。

--[no-]expect-discarded-cache

[高级] 基于查询执行后缓存将被丢弃的假设,做出关于评估哪些谓词以及将什么写入磁盘缓存的决策。

--[no-]keep-full-cache

[高级] 评估完成后不清除磁盘缓存。如果您随后要进行 codeql dataset cleanupcodeql database cleanup,这可以节省时间。

--max-disk-cache=<MB>

设置中间查询结果的磁盘缓存可以使用空间的最大量。

如果没有明确配置此大小,评估器将尝试使用基于数据集大小和查询复杂性的“合理”数量的缓存空间。显式设置高于此默认用量的限制将启用其他缓存,这可以加快后续查询的速度。

--min-disk-free=<MB>

[高级] 设置文件系统上目标可用空间量。

如果没有给出--max-disk-cache,如果文件系统的可用空间低于此值,评估器将努力减少磁盘缓存的使用。

--min-disk-free-pct=<pct>

[高级] 设置文件系统上目标可用空间比例。

如果没有给出--max-disk-cache,如果文件系统的可用空间低于此百分比,评估器将努力减少磁盘缓存的使用。

--external=<pred>=<file.csv>

包含外部谓词 <pred> 行的 CSV 文件。可以提供多个--external选项。

--xterm-progress=<mode>

[高级] 控制是否使用 xterm 控制序列在 QL 评估期间显示进度跟踪。可能的值为

no:从不产生高级进度;假设是一个哑终端。

auto (默认):自动检测命令是否在合适的终端中运行。

yes:假设终端可以理解 xterm 控制序列。此功能仍然依赖于能够自动检测终端的大小,如果给出-q,则也会被禁用。

25x80(或类似):与yes类似,并且还显式地给出终端的大小。

25x80:/dev/pts/17(或类似):在与 stderr 不同的终端上显示高级进度。主要用于内部测试。

控制输出结构化评估器日志的选项

--evaluator-log=<file>

[高级] 将关于评估器性能的结构化日志输出到给定的文件。此日志文件的格式可能会随时更改,恕不另行通知,但将是一系列由两个换行符(默认为)或一个换行符(如果传递了--evaluator-log-minify选项)分隔的 JSON 对象。请使用codeql generate log-summary <file>生成此文件的更稳定的摘要,并避免直接解析文件。如果文件已存在,则会覆盖该文件。

--evaluator-log-minify

[高级] 如果传递了--evaluator-log选项,则传递此选项还会减小生成的 JSON 日志的大小,但代价是使其更难以阅读。

控制 RAM 使用量的选项

-M, --ram=<MB>

查询评估器将努力使其总内存占用量低于此值。(但是,对于大型数据库,文件支持的内存映射可能会超过此阈值,如果内存压力过大,这些映射可以交换到磁盘)。

该值至少应为 2048 MB;较小的值将被透明地向上取整。

控制 QL 编译的选项

--warnings=<mode>

如何处理来自 QL 编译器的警告。其中之一是

hide:抑制警告。

show (默认):打印警告但继续编译。

error:将警告视为错误。

--no-debug-info

不要在 RA 中为调试发出源位置信息。

--[no-]fast-compilation

[已弃用] [高级] 省略特别缓慢的优化步骤。

--no-release-compatibility

[高级] 使用最新的编译器功能,但代价是可移植性。

有时,新的 QL 语言功能和评估器优化将在 QL 评估器中支持几个版本,然后才能在 QL 编译器中默认启用它们。这有助于确保您在最新 CodeQL 版本中开发查询时获得的性能可以与可能仍在用于代码扫描或 CI 集成的稍旧版本相匹配。

如果您不关心您的查询与其他(较早或较晚)CodeQL 版本的兼容性,您可以通过使用此标志尽早启用编译器中的最新改进,有时可以获得少量额外的性能。

在没有要启用的最新改进的版本中,此选项会静默地不做任何操作。因此,在您的全局 CodeQL 配置文件中设置它一次就足够安全了。

v2.11.1起可用。

--[no-]local-checking

仅对使用的 QL 源的一部分执行初始检查。

--no-metadata-verification

不要检查 QLDoc 注释中嵌入的查询元数据的有效性。

--compilation-cache-size=<MB>

[高级] 覆盖编译缓存目录的默认最大大小。

--fail-on-ambiguous-relation-name

[高级] 如果在编译期间生成了不明确的关系名,则编译失败。

设置编译环境的选项

--search-path=<dir>[:<dir>...]

可以找到 QL 包的目录列表。每个目录都可以是 QL 包(或包含根目录中.codeqlmanifest.json文件的包捆绑包)或一个或多个此类目录的直接父目录。

如果路径包含多个目录,则它们的顺序定义它们之间的优先级:当必须解析的包名在一个以上的目录树中匹配时,第一个给出的目录获胜。

在查询其中一个语言时,指向开源 CodeQL 存储库的签出应该可以工作。

如果您已将 CodeQL 存储库签出为解压的 CodeQL 工具链的同级目录,则不需要此选项;将始终搜索此类同级目录以查找无法找到的其他 QL 包。(如果此默认值不起作用,强烈建议在每个用户的配置文件中一次性设置--search-path)。

(注意:在 Windows 上,路径分隔符是;)。

--additional-packs=<dir>[:<dir>...]

如果给出了此目录列表,则将在--search-path中的目录之前搜索这些目录中的包。这些之间的顺序无关紧要;如果通过此列表在两个不同位置找到包名,则这是一个错误。

如果您暂时正在开发一个也出现在默认路径中的包的新版本,这将非常有用。另一方面,不建议在配置文件中覆盖此选项;某些内部操作会动态添加此选项,覆盖任何已配置的值。

(注意:在 Windows 上,路径分隔符是;)。

--library-path=<dir>[:<dir>...]

[高级] 将添加到 QL 库的原始导入搜索路径的可选目录列表。只有在使用尚未打包为 QL 包的 QL 库时才应使用此选项。

(注意:在 Windows 上,路径分隔符是;)。

--dbscheme=<file>

[高级] 明确定义应针对其编译的 dbscheme 查询。只有非常确定自己在做什么的调用者才应提供此选项。

--compilation-cache=<dir>

[高级] 指定一个用作编译缓存的附加目录。

--no-default-compilation-cache

[高级] 不要使用标准位置(例如包含查询的 QL 包或 CodeQL 工具链目录中)的编译缓存。

配置 CodeQL 包管理器的选项

--registries-auth-stdin

通过传递以逗号分隔的 <registry_url>=<token> 对列表来验证 GitHub Enterprise Server 容器注册表。

例如,您可以传递 https://containers.GHEHOSTNAME1/v2/=TOKEN1,https://containers.GHEHOSTNAME2/v2/=TOKEN2 来验证两个 GitHub Enterprise Server 实例。

这将覆盖 CODEQL_REGISTRIES_AUTH 和 GITHUB_TOKEN 环境变量。如果您只需要验证 github.com 容器注册表,则可以使用更简单的 --github-auth-stdin 选项进行身份验证。

--github-auth-stdin

通过标准输入传递 github.com GitHub Apps 令牌或个人访问令牌来验证 github.com 容器注册表。

要验证 GitHub Enterprise Server 容器注册表,请传递 --registries-auth-stdin 或使用 CODEQL_REGISTRIES_AUTH 环境变量。

这将覆盖 GITHUB_TOKEN 环境变量。

控制扩展包的选项

--model-packs=<name@range>...

一系列 CodeQL 包名称,每个名称都有一个可选的版本范围,用作模型包来自定义即将评估的查询。

常用选项

-h, --help

显示此帮助文本。

-J=<opt>

[高级] 为运行命令的 JVM 提供选项。

(请注意,包含空格的选项将无法正确处理。)

-v, --verbose

逐步增加打印的进度消息数量。

-q, --quiet

逐步减少打印的进度消息数量。

--verbosity=<level>

[高级] 将详细程度显式设置为错误、警告、进度、进度+、进度++、进度+++ 之一。覆盖 -v-q

--logdir=<dir>

[高级] 将详细日志写入给定目录中的一个或多个文件中,生成的名称包含时间戳和正在运行的子命令的名称。

(要写入名称完全受您控制的日志文件,请改用 --log-to-stderr 并根据需要重定向 stderr。)

--common-caches=<dir>

[高级] 控制磁盘上缓存数据的存储位置,这些数据将在 CLI 的多次运行之间持久存在,例如下载的 QL 包和编译的查询计划。如果未显式设置,则默认为用户主目录中名为 .codeql 的目录;如果该目录不存在,则会创建它。

v2.15.2 版本起可用。