跳至主要内容

数据库分析

分析数据库,在源代码的上下文中生成有意义的结果。

谁可以使用此功能?

CodeQL 可用于以下存储库类型

本文档内容

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

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

概要

Shell
codeql database analyze --format=<format> --output=<output> [--threads=<num>] [--ram=<MB>] <options>... -- <database> <query|dir|suite|pack>...

描述

分析数据库,在源代码的上下文中生成有意义的结果。

对 CodeQL 数据库运行查询套件(或一些单独的查询),生成结果,以 SARIF 或其他解释格式样式化为警报或路径。

此命令结合了 codeql database run-queriescodeql database interpret-results 命令的效果。如果您想运行结果 *不* 满足作为源代码警报进行解释的要求的查询,请改用 codeql database run-queriescodeql query run,然后使用 codeql bqrs decode 将原始结果转换为可读的表示法。

选项

主要选项

<database>

[必填] 要查询的 CodeQL 数据库的路径。

<querysuite|pack>...

要执行的查询。每个参数都采用 scope/name@range:path 的形式,其中

  • scope/name 是 CodeQL 包的限定名称。
  • range 是一个语义版本范围。
  • path 是一个文件系统路径。

如果指定了 scope/name,则 rangepath 是可选的。缺少 range 表示指定包的最新版本。缺少 path 表示指定包的默认查询套件。

path 可以是 *.ql 查询文件、包含一个或多个查询的目录或 .qls 查询套件文件。如果没有指定包名称,则必须提供 path,并且它将被解释为相对于当前进程的当前工作目录。

要指定包含文字 @:path,请在参数前面使用 path: 作为前缀,如下所示:path:directory/with:and@/chars

如果指定了 scope/namepath,则 path 不能是绝对路径。它被认为相对于 CodeQL 包的根目录。

如果未指定任何查询,则 CLI 将自动确定一组合适的查询来运行。特别是,如果在数据库创建时使用 --codescanning-config 指定了代码扫描配置文件,则将使用此配置文件中的查询。否则,将使用正在分析的语言的默认查询。

--format=<format>

[必填] 要以其写入结果的格式。以下选项之一:

csv:格式化的逗号分隔值,包括包含规则和警报元数据的列。

sarif-latest:静态分析结果交换格式 (SARIF),一种基于 JSON 的格式,用于描述静态分析结果。此格式选项使用最新支持的版本 (v2.1.0)。此选项不适合在自动化中使用,因为它会在不同 CodeQL 版本之间生成不同版本的 SARIF。

sarifv2.1.0:SARIF v2.1.0。

graphtext:表示图形的文本格式。仅与具有 @kind graph 的查询兼容。

dgml:有向图标记语言,一种基于 XML 的格式,用于描述图形。仅与具有 @kind graph 的查询兼容。

dot:Graphviz DOT 语言,一种基于文本的格式,用于描述图形。仅与具有 @kind graph 的查询兼容。

-o, --output=<output>

[必填] 要将结果写入的输出路径。对于图形格式,这应该是一个目录,并且结果(如果此命令支持解释多个查询,则为结果)将写入该目录中。

--[no-]rerun

即使查询似乎已经在数据库中存储了 BQRS 结果,也要对其进行评估。

--no-print-diagnostics-summary

不要将分析诊断的摘要打印到标准输出。

--no-print-metrics-summary

不将分析指标的摘要打印到标准输出。

--max-paths=<maxPaths>

为每个带有路径的警报生成的路径的最大数量。(默认值:4)

--[no-]sarif-add-file-contents

[SARIF 格式专用] 包含至少在一个结果中引用的所有文件的完整文件内容。

--[no-]sarif-add-snippets

[SARIF 格式专用] 包含结果中提到的每个位置的代码片段,并在报告的位置前后提供两行上下文。

--[no-]sarif-add-query-help

[SARIF 格式专用] [已弃用] 包含所有查询的 Markdown 查询帮助。它从 /path/to/query.md 文件加载 /path/to/query.ql 的查询帮助。如果未提供此标志,则默认行为是仅包含自定义查询的帮助,即查询包中不属于 `codeql/<lang&rt;-queries` 格式的查询。此选项在传递给 codeql bqrs interpret 时无效。

--sarif-include-query-help=<mode>

[SARIF 格式专用] 指定是否在 SARIF 输出中包含查询帮助。以下选项之一:

always:包含所有查询的查询帮助。

custom_queries_only (默认值):仅包含自定义查询的查询帮助,即查询包中不属于 `codeql/<lang&rt;-queries` 格式的查询。

never:不包含任何查询的查询帮助。

此选项在传递给 codeql bqrs interpret 时无效。

v2.15.2 起可用。

--no-sarif-include-alert-provenance

[高级] [SARIF 格式专用] 不在 SARIF 输出中包含警报来源信息。

v2.18.1 起可用。

--[no-]sarif-group-rules-by-pack

[SARIF 格式专用] 将每个查询的规则对象置于其对应的 QL 包下,位于 <run>.tool.extensions 属性中。此选项在传递给 codeql bqrs interpret 时无效。

--[no-]sarif-multicause-markdown

[SARIF 格式专用] 对于具有多个原因的警报,除了作为普通字符串之外,还在输出中将其包含为 Markdown 格式的项目符号列表。

--no-sarif-minify

[SARIF 格式专用] 生成格式良好的 SARIF 输出。默认情况下,SARIF 输出会被缩小以减小输出文件的大小。

--sarif-run-property=<String=String>

[SARIF 格式专用] 要添加到生成的 SARIF 'run' 属性包中的键值对。可以重复使用。

--no-group-results

[SARIF 格式专用] 每个消息生成一个结果,而不是每个唯一位置生成一个结果。

--csv-location-format=<csvLocationFormat>

在 CSV 输出中生成位置的格式。以下选项之一:uri、line-column、offset-length。(默认值:line-column)

--dot-location-url-format=<dotLocationUrlFormat>

一个格式字符串,用于定义在 DOT 输出中生成文件位置 URL 的格式。可以使用以下占位符:{path} {start:line} {start:column} {end:line} {end:column}、{offset}、{length}

--[no-]sublanguage-file-coverage

[仅限 GitHub.com 和 GitHub Enterprise Server v3.12.0+] 使用子语言文件覆盖信息。这将计算、显示和导出共享 CodeQL 提取器的语言(如 C 和 C++、Java 和 Kotlin 以及 JavaScript 和 TypeScript)的单独文件覆盖信息。

v2.15.2 起可用。

--sarif-category=<category>

[SARIF 格式专用] [推荐] 指定要包含在 SARIF 输出中的此分析的类别。类别可用于区分对同一提交和存储库执行的但在不同语言或代码的不同部分执行的多个分析。

如果你以多种不同方式分析代码库的同一版本(例如,针对不同的语言),并将结果上传到 GitHub 以在代码扫描中呈现,则每次分析之间的此值应有所不同,这会告诉代码扫描这些分析是 *补充* 而不是 *取代* 彼此。(对于代码库的 *不同* 版本,每次运行同一分析时,这些值应保持一致。)

此值将显示为(如果尚未存在,则附加尾部斜杠)<run>.automationDetails.id 属性。

--no-database-extension-packs

[高级] 在数据库创建期间省略存储在数据库中的扩展包,无论是来自 Code Scanning 配置文件还是来自分析代码库的“extensions”目录中存储的扩展文件。

--no-database-threat-models

[高级] 在数据库创建期间省略从 Code Scanning 配置文件中存储在数据库中的威胁模型配置。

--[no-]download

在分析之前下载任何缺少的查询。

控制要使用的模型包的选项

--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 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 环境变量。

常用选项

-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 起可用。