Принципы анализа кода CodeQL

Завершено

Для реализации проверки кода с помощью CodeQL необходимо понимание того, как средство анализирует код.

Анализ CodeQL состоит из трех этапов:

  1. Подготовив код, создав базу данных CodeQL.
  2. выполнение запросов CodeQL к этой базе данных;
  3. интерпретация результатов этих запросов.

В этом уроке вы узнаете о трех этапах анализа CodeQL.

Создание базы данных

Для создания базы данных CodeQL сначала извлекает отдельное реляционное представление каждого исходного файла в базе кода.

Для компилируемых языков извлечение выполняется путем мониторинга обычного процесса сборки. При каждом вызове компилятора для обработки исходного файла создается копия этого файла и выполняется сбор всех актуальных сведений об исходном коде. К ним относятся синтаксические данные об абстрактном синтаксическом дереве, семантические данные о привязке имен и сведения о типах.

Для интерпретируемых языков средство извлечения выполняется непосредственно для исходного кода, что позволяет разрешить зависимости для обеспечения точного представления базы кода.

Существует один средство извлечения для каждого языка, поддерживаемого CodeQL, чтобы процесс извлечения был максимально точным. Для многоязыковых баз кода базы данных создаются по очереди для каждого языка.

После извлечения все данные, необходимые для анализа (реляционные данные, скопированные исходные файлы и схема базы данных, определяющая взаимные отношения в данных), импортируются в один каталог, известный как база данных CodeQL.

Выполнение запросов

После создания базы данных CodeQL один или несколько запросов выполняются к нему. Запросы CodeQL пишутся на специально разработанном объектно-ориентированном языке запросов, именуемом QL.

Запросы, взятые из репозитория CodeQL (или пользовательские запросы, написанные самостоятельно), можно выполнить с помощью расширения CodeQL для VS Code или интерфейса командной строки CodeQL.

Результаты запроса

Последний шаг преобразует результаты, созданные во время выполнения запроса, в форму, более значимую в контексте исходного кода, что означает, что результаты интерпретируются таким образом, чтобы выделить потенциальную проблему, которую запросы предназначены для поиска.

Снимок экрана: результаты запроса CodeQL.

Запросы содержат свойства метаданных, которые указывают, как должны интерпретироваться результаты. Например, для некоторых запросов отображается простое сообщение в одном месте кода. Для других отображается ряд расположений, представляющих шаги на пути потока данных или потока управления, а также сообщение, объясняющее важность результата. Запросы, у которых нет метаданных, не интерпретируются; их результаты выводятся в виде таблицы, а не отображаются в исходном коде.

После интерпретации результаты выводятся для проверки кода и его рассмотрения. Результаты интерпретируемых запросов автоматически отображаются в исходном коде в CodeQL для Visual Studio Code. Результаты, созданные cli CodeQL, можно выводить в ряд различных форматов для использования с различными инструментами.