コンパイル言語の分析について
C/C++、C#、Go、Java、Kotlin、および Swift などのコンパイル型言語の場合、 CodeQL は、分析中にビルドされたファイルのみをスキャンします。 そのため、一部のソース コードが正しくコンパイルされていない場合、スキャンされるコード行の数は想定よりも少なくなります。 これは、いくつかの理由で発生します。
-
CodeQL の
autobuild
機能では、ヒューリスティックを使用してリポジトリにコードがビルドされます。 ただし、このアプローチではリポジトリの分析が不完全になることがあります。 たとえば、1 つのリポジトリに複数のbuild.sh
コマンドが存在する場合、autobuild
ステップで実行されるコマンドは 1 つのみであるため、一部のソース ファイルがコンパイルされない可能性があります。したがって、分析が完了しない可能性があります。 -
一部のコンパイラは CodeQL で動作せず、コードの分析中に問題が発生する可能性があります。 たとえば、ベンダー固有の C コンパイラのほとんどは、CodeQL では認識されません。 C コードを分析するには、認識されるコンパイラ (GCC、Clang、MSVC など) を使ってコンパイルする必要があります。
CodeQL 分析で予想よりも少ないコード行がスキャンされる場合は、ワークフローに autobuild
ステップが含まれる場合は autobuild
ステップをビルド コマンドに置き換えるか、CodeQL データベース内のソース ファイルのコピーを検査してみてください。
autobuild
ステップを置き換える
autobuild
プロセスを、運用環境で使用するのと同じビルド コマンドに置き換えます。 これにより、CodeQL では、スキャンするすべてのソース ファイルをコンパイルする方法を正確に認識できます。
ビルド ステップの定義の詳細については、「コンパイル済み言語の CodeQL コード スキャン」を参照してください。
CodeQL データベース内のソース ファイルのコピーを調べる
CodeQL データベースに含まれるソース コードのコピーを調べることで、一部のソース ファイルが分析されていない理由を理解できる場合があります。 Actions ワークフローからデータベースを取得するには、CodeQL ワークフロー ファイルの init
ステップを変更し、debug: true
を設定します。
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
debug: true
これにより、ローカル コンピューターにダウンロードできるアクション成果物としてデータベースがアップロードされます。 詳しくは、「ワークフローからのデータの格納と共有」をご覧ください。
成果物には、CodeQL によってスキャンされたソース ファイルのアーカイブされたコピー (src.zip と呼ばれる) が含まれます。 リポジトリ内のソース コード ファイルと src.zip 内のファイルを比較すると、不足しているファイルの種類を確認できます。 分析されていないファイルの種類がわかったら、CodeQL 分析のワークフローをどのように変更する必要があるかを容易に理解できます。