CodeQL ではコードがどのように分析されますか?

完了

CodeQL によるコード スキャンを実装するには、このツールでどのようにコードが分析されるかを理解する必要があります。

CodeQL 分析は 3 つの手順で構成されます。

  1. CodeQL データベースを作成してコードを準備する。
  2. データベースに対して CodeQL クエリを実行する。
  3. クエリ結果を解釈する。

このユニットでは、CodeQL 分析の 3 つのフェーズについて学習します。

データベースの作成

データベースを作成する場合、CodeQL ではまず、コードベース内の各ソース ファイルの単一のリレーショナル表現を抽出します。

コンパイル済み言語では、通常のビルド プロセスを監視して抽出を行います。 ソース ファイルを処理するためにコンパイラが呼び出されると、毎回そのファイルのコピーが作成され、ソース コードに関するすべての関連情報が収集されます。 これには、抽象構文ツリーに関する構文データと、名前バインドと型情報に関するセマンティック データが含まれます。

インタープリター言語の場合、エクストラクターがソース コードで直接実行され、依存関係が解決されてコードベースの正確な表現が得られます。

抽出プロセスができる限り正確になるように、CodeQL でサポートされている言語ごとに 1 つのエクストラクターがあります。 複数言語のコードベースでは、一度に 1 つの言語でデータベースが生成されます。

抽出後、分析に必要なすべてのデータ (リレーショナル データ、コピーされたソース ファイル、およびデータ内の相互関係を指定する言語固有のデータベース スキーマ) が、CodeQL データベースと呼ばれる 1 つのディレクトリにインポートされます。

クエリ実行

CodeQL データベースを作成すると、それに対して 1 つ以上のクエリが実行されます。 CodeQL クエリは、QL と呼ばれる特別に設計されたオブジェクト指向のクエリ言語で記述されます。

CodeQL リポジトリからチェック アウトされたクエリ (または自分で記述したカスタム クエリ) を、VS Code 用 CodeQL 拡張機能または CodeQL CLI を使用して実行できます。

Query results

最後の手順では、クエリ実行中に生成された結果が、ソース コードの文脈で意味を強める形式に変換されます。つまり、クエリが設計されたのは潜在的な問題を見つけるためですが、その問題を強調するように結果が解釈されます。

CodeQL のクエリ結果のスクリーンショット

クエリには、結果の解釈方法を示すメタデータ プロパティが含まれています。 たとえば、クエリによっては、コード内の 1 つの場所に単純なメッセージが表示される場合があります。 その他、データ フローまたは制御フローのパスに沿ったステップを表す一連の場所が、結果の重要性を説明するメッセージと共に表示される場合もあります。 メタデータのないクエリは解釈されません。その結果はテーブルとして出力され、ソース コードには表示されません。

解釈の後、結果がコードのレビューとトリアージのために出力されます。 Visual Studio Code 用の CodeQL では、解釈されたクエリの結果がソース コードに自動的に表示されます。 CodeQL CLI によって生成される結果は、さまざまなツールで使用するためにさまざまな形式で出力できます。