此内容描述了 CodeQL CLI 的最新版本。有关此版本的更多信息,请参阅 https://github.com/github/codeql-cli-binaries/releases。
要查看早期版本中此命令可用选项的详细信息,请在终端中使用 --help
选项运行该命令。
概要
codeql database run-queries [--threads=<num>] [--ram=<MB>] <options>... -- <database> <query|dir|suite|pack>...
codeql database run-queries [--threads=<num>] [--ram=<MB>] <options>... -- <database> <query|dir|suite|pack>...
描述
[管道] 同时运行一组查询。
对 CodeQL 数据库运行一个或多个查询,并将结果保存到数据库目录的 results 子目录中。
稍后可以通过 codeql database interpret-results 或逐个查询地通过 codeql bqrs decode 或 codeql bqrs interpret 将结果转换为可读格式。
如果您的查询以可解释为源代码警报的形式生成结果,您可能会发现 codeql database analyze 是一种更方便的运行方式。 codeql database analyze 将 codeql database run-queries 与 codeql database interpret-results 结合在一个步骤中。特别是,codeql database analyze 可以生成 SARIF 格式的输出,该格式可用于各种警报查看器。
或者,如果您只有一个查询要运行,您可能更喜欢 codeql query run,它可以显示人类可读的输出,以便在调试时快速检查结果。
选项
主要选项
<database>
[必填] 要查询的 CodeQL 数据库的路径。
<querysuite|pack>...
要执行的查询。每个参数都采用 scope/name@range:path
的形式,其中
scope/name
是 CodeQL 包的限定名称。range
是一个语义版本范围。path
是一个文件系统路径。
如果指定了 scope/name
,则 range
和 path
是可选的。缺少 range
意味着指定包的最新版本。缺少 path
意味着指定包的默认查询套件。
path
可以是 *.ql
查询文件、包含一个或多个查询的目录或 .qls
查询套件文件。如果没有指定包名称,则必须提供 path
,并且将根据当前进程的当前工作目录进行解释。
要指定包含文字 @
或 :
的 path
,请在参数前使用 path:
作为前缀,例如:path:directory/with:and@/chars
。
如果指定了 scope/name
和 path
,则 path
不能是绝对路径。它被认为相对于 CodeQL 包的根目录。
如果未指定任何查询,则 CLI 将自动确定一组合适的查询来运行。特别是,如果在数据库创建时使用 --codescanning-config
指定了代码扫描配置文件,则将使用此配置文件中的查询。否则,将使用正在分析的语言的默认查询。
--no-rerun
省略对似乎已在输出位置存储了 BQRS 结果的查询的评估。
--no-database-extension-packs
[高级] 在数据库创建期间省略存储在数据库中的扩展包,这些包可以来自代码扫描配置文件或存储在分析代码库的“extensions”目录中的扩展文件。
--no-database-threat-models
[高级] 在数据库创建期间省略存储在数据库中的威胁模型配置,这些配置来自代码扫描配置文件。
控制要使用的模型包的选项
--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 dataset cleanup 或 codeql 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 环境变量。
常用选项
-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
起可用。