Skip to main content

database analyze

データベースを分析し、ソース コードのコンテキストで意味のある結果を生成します。

この機能を使用できるユーザーについて

GitHub CodeQL は、インストール時にユーザーごとにライセンスされます。 CodeQL は、ライセンスの制限の下で特定のタスクでのみ使用できます。 詳しくは、「CodeQL CLI について」を参照してください。

GitHub Advanced Security ライセンスがある場合は、CodeQL を使用して、自動分析、継続的インテグレーション、継続的デリバリーを行うことができます。 詳しくは、「GitHub Advanced Security について」を参照してください。

この記事の内容

このコンテンツでは、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-queries または codeql query run を代わりに使用してから、codeql bqrs decode を使用して生の結果を読み取り可能な表記に変換します。__

[オプション]

主なオプション

<database>

[必須] クエリを実行する CodeQL データベースのパス。

<querysuite|pack>...

実行するクエリ。 各引数は、scope/name@range:path の形式になります。ここで、

  • scope/name は、CodeQL パックの修飾名です。
  • range は、semver の範囲です。
  • path は、ファイル システムのパスです。

scope/name を指定する場合、rangepath は省略可能です。 range がない場合は、指定したパックの最新バージョンを意味します。 path がない場合は、指定したパックのデフォルトのクエリ スイートを意味します。

path は、*.ql クエリ ファイル、1 つまたは複数のクエリを含むディレクトリ、または .qls クエリ スイート ファイルのいずれかにすることができます。 パック名を指定しない場合は、path を指定する必要があり、現在のプロセスの現在の作業ディレクトリからの相対パスとして解釈されます。

リテラル @ または : を含む path を指定するには、引数のプレフィックスとして path: を使います (例: path:directory/with:and@/chars)。

scope/namepath を指定する場合、path を絶対パスにすることはできません。 これは、CodeQL パックのルートを基準にしていると見なされます。

クエリを指定しない場合、実行する適切なクエリ セットが CLI によって自動的に決定されます。 具体的には、データベースの作成時に --codescanning-config を使って Code Scanning の構成ファイルを指定した場合は、そのクエリが使われます。 それ以外の場合は、分析されている言語の既定のクエリが使われます。

--format=<format>

[必須] 結果を書き込む形式。 つぎのいずれかです。

csv: ルールとアラート メタデータの両方がある列を含む、書式設定されたコンマ区切りの値。

sarif-latest: Static Analysis Results Interchange Format (SARIF)。静的な分析結果を記述するための JSON ベースの形式。 この形式オプションでは、サポートされている最新バージョン (v2.1.0) が使用されます。 このオプションは、異なる CodeQL バージョン間で異なるバージョンの SARIF が生成されるため、自動化での使用には適していません。

sarifv2.1.0: SARIF v2.1.0。

graphtext: グラフを表すテキスト形式。 @kind グラフを使用するクエリとのみ互換性があります。

dgml: Directed Graph Markup Language。グラフを記述するための XML ベースの形式。 @kind グラフを使用するクエリとのみ互換性があります。

dot: Graphviz DOT 言語。グラフを記述するためのテキストベースの形式。 @kind グラフを使用するクエリとのみ互換性があります。

-o, --output=<output>

[必須] 結果を書き込む出力パス。 グラフ形式の場合、これはディレクトリである必要があり、結果 (このコマンドで複数のクエリの解釈がサポートされている場合は複数の結果) がそのディレクトリ内に書き込まれます。

--[no-]rerun

BQRS の結果が既にデータベースに格納されていると考えられるクエリも評価します。

--no-print-diagnostics-summary

分析した診断の概要を標準出力に出力しません。

--no-print-metrics-summary

分析したメトリックの概要を標準出力に出力しません。

--max-paths=<maxPaths>

パスを含むアラートごとに生成するパスの最大数。 (既定値: 4)

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

[SARIF 形式のみ] 少なくとも 1 つの結果で参照されるすべてのファイルの完全なファイル コンテンツを含めます。

--[no-]sarif-add-snippets

[SARIF 形式のみ] 結果に示されている各場所のコード スニペットを含めます。報告された場所の前後に 2 行のコンテキストがあります。

--[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-group-rules-by-pack

[SARIF 形式のみ] <run>.tool.extensions プロパティの対応する QL パックの下に、各クエリのルール オブジェクトを配置します。 このオプションは、codeql bqrs interpret に渡しても効果はありません。

--[no-]sarif-multicause-markdown

[SARIF 形式のみ] 複数の原因があるアラートの場合は、プレーン文字列に加え、マークダウン形式の明細化されたリストとして出力に含めます。

--no-group-results

[SARIF 形式のみ] 一意の場所ごとに 1 つの結果ではなく、メッセージごとに 1 つの結果を生成します。

--csv-location-format=<csvLocationFormat>

CSV 出力で場所を生成する形式。 次のいずれか: uri、行列、オフセット長。 (既定値: 行列)

--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 以降のみ] サブ言語のファイル カバレッジ情報を使用します。 これにより、C と C++、Java と Kotlin、JavaScript、TypeScript などの CodeQL エクストラクターを共有する言語の個別のファイル カバレッジ情報を計算、表示、エクスポートします。

v2.15.2 以降で使用できます。

--sarif-category=<category>

[ SARIF 形式のみ] [ 推奨]SARIF 出力に含めるこの分析のカテゴリを指定します。 カテゴリを使用して、同じコミットとリポジトリ (ただし、異なる言語またはコードの異なる部分) で実行される複数の分析を区別できます。

同じバージョンのコード ベースを複数の異なる方法で分析し (たとえば、言語が異なる場合)、コード スキャンでプレゼンテーションするために GitHub に結果をアップロードする場合、この値は各分析間で異なる必要があります。これにより、コード スキャンに対して、分析では互いに ''置き換える'' のではなく ''補足する'' ことが示されます __ __ (コード ベースの ''異なる'' バージョンに対して同じ分析の実行間で値の一貫性を保つ必要があります)。__

この値は <run>.automationDetails.id プロパティとして表示されます(まだ存在しない場合は末尾にスラッシュが追加されます)。

--no-database-extension-packs

[詳細設定] コード スキャン構成ファイルから、または分析されたコードベースの 'extensions' ディレクトリに格納されている拡張ファイルからデータベースを作成する際に、データベースに格納されている拡張パックを省略します。

--no-database-threat-models

[詳細設定] コード スキャン構成ファイルからデータベースを作成する際に、データベースに格納されている脅威モデルの構成を省略します。

--[no-]download

分析する前に、不足しているクエリをダウンロードします。

使用する脅威モデルを制御するためのオプション

--threat-model=<name>...

有効または無効にする脅威モデルの一覧。

引数は脅威モデルの名前であり、必要に応じて '!' が付けられます。 '!' が付いていない場合、その名前付き脅威モデルとそのすべての子孫が有効になります。 '!' が付いている場合、その名前付き脅威モデルとそのすべての子孫が無効になります。

"default" 脅威モデルは既定で有効になっていますが、'--threat-model !default' を指定することで無効にすることができます。

"all" 脅威モデルを使用して、すべての脅威モデルを有効または無効にすることができます。

--threat-model オプションは順番に処理されます。 たとえば、'--threat-model local --threat-model !environment' を指定すると、'environment' 脅威モデルを除き、'local' グループ内のすべての脅威モデルが有効になります。

このオプションは、脅威モデルをサポートする言語にのみ有効です。

v2.15.3 以降で使用できます。

クエリ エバリュエーターを制御するためのオプション

--[no-]tuple-counting

[詳細設定] クエリ エバリュエーター ログの各評価ステップのタプル数を表示します。 --evaluator-log オプションを指定すると、コマンドで生成されるテキストベースのログと構造化された JSON ログの両方にタプル数が含まれます (これは、複雑な QL コードのパフォーマンス最適化に役立ちます)。

--timeout=<seconds>

[詳細設定] クエリ評価のタイムアウトの長さを秒単位で設定します。

タイムアウト機能は、複雑なクエリの評価に "かなり長い時間" がかかるケースを検出することを目的としています。 クエリの評価にかかる合計時間を制限するのは効果的な方法ではありません。 評価は、計算の個別に時間指定された各部分がタイムアウト内に完了する限り続行できます。 現在、これらの個別に時間指定された部分は、最適化されたクエリの "RA レイヤー" ですが、将来変更される可能性があります。

タイムアウトが指定されていない場合、またはタイムアウトに 0 が指定されている場合、タイムアウトは設定されません (デフォルトのタイムアウトが 5 分である codeql test run を除きます)。

-j, --threads=<num>

この数のスレッドをクエリの評価に使用します。

既定値は 1 です。 0 を渡して、コンピューター上のコアごとに 1 つのスレッドを使用したり、N を渡して、N 個のコアを未使用のままにしたりすることができます (ただし、その場合でも、少なくとも 1 つのスレッドが使用されます)。

--[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>

[詳細設定] 指定されたファイルにエバリュエーターのパフォーマンスに関する構造化ログを出力します。 このログ ファイルの形式は、予告なく変更される場合がありますが、2 つの改行文字 (既定) または --evaluator-log-minify オプションが渡された場合は 1 つの改行文字で区切られた 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 ファイルを含むパックのバンドル)、または 1 つ以上のこのようなディレクトリの直接の親ディレクトリのいずれかです。

パスに複数のディレクトリを含める場合は、それらの順序で、それらの間の優先順位を定義します。解決する必要があるパック名が複数のディレクトリ ツリーで一致する場合は、最初に指定したものが優先されます。

オープンソースの CodeQL リポジトリのチェックアウトでこれを指定すると、そこにある言語の 1 つを照会するときに機能するはずです。

CodeQL リポジトリを、アンパックされた CodeQL ツールチェーンの兄弟としてチェックアウトしている場合、このオプションを指定する必要はありません。このような兄弟ディレクトリは、他の方法では見つからない QL パックについて常に検索されます (この既定が機能しない場合は、ユーザーごとの構成ファイルで --search-path を一度だけ設定することを強くお勧めします)。

(注: Windows では、パスの区切り記号は ; です)。

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

このディレクトリ リストを指定した場合、ディレクトリは、--search-path で指定したものより前に、パックについて検索されます。 これらの間の順序は重要ではありません。このリストの 2 か所でパック名が見つかった場合は、エラーです。

これは、デフォルトのパスにも表示される新しいバージョンのパックを一時的に開発している場合に役立ちます。 一方、構成ファイルでこのオプションをオーバーライドすることは "お勧めしません"。内部アクションによっては、このオプションがオンザフライで追加され、構成済みの値がオーバーライドされます。__

(注: 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 を渡して、 2 つの 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>

[詳細設定] タイムスタンプと実行中のサブコマンドの名前を含む生成された名前を使用して、指定されたディレクトリ内の 1 つまたは複数のファイルに詳細なログを書き込みます

(完全に制御できる名前でログ ファイルを書き込むには、代わりに --log-to-stderr を指定し、必要に応じて stderr をリダイレクトします)。

--common-caches=<dir>

[[詳細設定] ダウンロードした QL パックやコンパイル済みクエリ プランなど、CLI の複数の実行間に保持される、ディスク上でキャッシュされたデータの場所を制御します。 明示的に設定されない場合、既定ではユーザーのホーム ディレクトリに名前が付けられた .codeql ディレクトリになります。まだ存在しない場合は作成されます。

v2.15.2 以降で使用できます。