此内容描述的是 CodeQL CLI 的最新版本。有关此版本的更多信息,请参阅 https://github.com/github/codeql-cli-binaries/releases。
要查看早期版本中此命令可用选项的详细信息,请在终端中使用 --help
选项运行该命令。
概要
codeql execute queries [--output=<dir|file.bqrs>] [--threads=<num>] <options>... -- <dataset> <query|dir|suite|pack>...
codeql execute queries [--output=<dir|file.bqrs>] [--threads=<num>] <options>... -- <dataset> <query|dir|suite|pack>...
描述
[底层实现] 对数据集运行一个或多个查询。
通常不应直接调用此命令。请改用 codeql database run-queries 或 codeql query run,它们将使用特定的 JVM 选项启动 codeql execute queries 以调整 QL 评估器的性能。
选项
主要选项
<dataset>
[必填] 要查询的原始 QL 数据集的路径。
<querysuite|pack>...
[必填] 要执行的查询。每个参数的格式为 scope/name@range:path
,其中
scope/name
是 CodeQL 包的限定名称。range
是 semver 范围。path
是文件系统路径。
如果指定了 scope/name
,则 range
和 path
是可选的。缺少 range
表示指定包的最新版本。缺少 path
表示指定包的默认查询套件。
path
可以是 *.ql
查询文件、包含一个或多个查询的目录或 .qls
查询套件文件。如果没有指定包名称,则必须提供 path
,并且它将被解释为当前进程的当前工作目录的相对路径。
要指定包含字面量 @
或 :
的 path
,请在参数前使用 path:
作为前缀,例如:path:directory/with:and@/chars
。
如果指定了 scope/name
和 path
,则 path
不能是绝对路径。它被认为是 CodeQL 包根目录的相对路径。
-o, --output=<dir|file.bqrs>
通常,这是一个现有目录,查询的 BQRS 输出将写入其中。此目录中的文件名将从 QL 文件名派生。
或者,如果只有一个查询要运行,它可能是要写入的实际 BQRS 文件的名称,或者可以省略以将结果的人类可读表示形式写入标准输出。
--no-rerun
省略对输出位置中似乎已存储 BQRS 结果的查询的评估。
控制要使用的模型包的选项
--model-packs=<
name@range>...
要作为模型包使用的一系列 CodeQL 包名称,每个名称都带有一个可选的版本范围,以自定义即将评估的查询。
控制要使用的威胁模型的选项
--threat-model=<name>...
要启用或禁用的威胁模型列表。
该参数是威胁模型的名称,前面可以选择加一个“!”。如果前面没有“!”,则启用命名的威胁模型及其所有后代。如果前面有“!”,则禁用命名的威胁模型及其所有后代。
默认情况下启用“default”威胁模型,但可以通过指定“--threat-model !default”来禁用它。
“all”威胁模型可用于启用或禁用所有威胁模型。
按顺序处理 --threat-model 选项。例如,“--threat-model local --threat-model !environment”启用“local”组中的所有威胁模型,但“environment”威胁模型除外。
此选项仅对支持威胁模型的语言有效。
自 v2.15.3
起可用。
控制查询评估器的选项
--[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 数据集清理或codeql 数据库清理,这可以节省时间。
--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>
[高级] 将关于评估器性能的结构化日志输出到给定的文件。此日志文件的格式可能会随时更改,恕不另行通知,但将是 JSON 对象流,由两个换行符(默认)或一个换行符(如果传递--evaluator-log-minify
选项)分隔。请使用codeql generate log-summary <file>
生成此文件的更稳定的摘要,并避免直接解析文件。如果文件已存在,则将被覆盖。
--evaluator-log-minify
[高级] 如果传递--evaluator-log
选项,则也传递此选项将减小生成的 JSON 日志的大小,但代价是使其更难以阅读。
控制 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 环境变量。
常用选项
-h, --help
显示此帮助文本。
-J=<opt>
[高级] 向运行命令的 JVM 提供选项。
(请注意,包含空格的选项将无法正确处理。)
-v, --verbose
逐步增加打印的进度消息数量。
-q, --quiet
逐步减少打印的进度消息数量。
--verbosity=<level>
【高级】显式设置详细程度级别为 errors、warnings、progress、progress+、progress++、progress+++ 之一。覆盖-v
和 -q
。
--logdir=<dir>
【高级】将详细日志写入给定目录中的一个或多个文件中,生成的名称包含时间戳和正在运行的子命令的名称。
(要写入名称完全可控的日志文件,请改用--log-to-stderr
并根据需要重定向 stderr。)
--common-caches=<dir>
【高级】控制磁盘上缓存数据的存储位置,这些数据将在 CLI 的多次运行之间持久存在,例如下载的 QL 包和已编译的查询计划。如果未显式设置,则默认为用户主目录中名为.codeql
的目录;如果该目录不存在,则会创建它。
自v2.15.2
版本起可用。