Примечание: Эта статья была перенесена с веб-сайта документации CodeQL в январе 2023 г.
Сведения об анализе баз данных с помощью CodeQL CLI
Примечание: В этой статье описываются функции, доступные в пакете CodeQL CLI 2.9.4, включенном в первоначальный выпуск GitHub Enterprise Server 3.6.
Если администратор сайта обновил вашу версию CodeQL CLI до более новой версии, ознакомьтесь с версией GitHub Enterprise Cloud этой статьи, чтобы узнать о последних возможностях.
Чтобы проанализировать базу кода, выполните запросы к базе данных CodeQL, извлеченной из кода.
Анализ CodeQL дает интерпретируемые результаты , которые могут отображаться в виде оповещений или путей в исходном коде.
Сведения о написании запросов для выполнения с database analyze
помощью см. в разделе Использование пользовательских запросов с CodeQL CLI.
Другие команды, выполняемые запросами
Запросы, выполняемые с database analyze
использованием строгих требований к метаданным. Вы также можете выполнять запросы, используя следующие подкоманды уровня сантехники:
-
database run-queries
, который выводит не интерпретируемые результаты в промежуточном двоичном формате, называемом BQRS -
query run
, который выводит файлы BQRS или выводит таблицы результатов непосредственно в командную строку. Просмотр результатов непосредственно в командной строке может быть полезен для итеративной разработки запросов с помощью CLI.
Запросы, выполняемые с помощью этих команд, не имеют одинаковых требований к метаданным.
Однако для сохранения доступных для чтения данных необходимо обработать каждый файл результатов BQRS с помощью bqrs decode
подкоманды сантехники. Поэтому в большинстве случаев проще всего использовать database analyze
для непосредственного создания интерпретируемых результатов.
Перед началом анализа необходимо:
- Настройте CodeQL CLI для локального выполнения команд.
- Создайте базу данных CodeQL для исходного кода, который требуется проанализировать.
Самый простой способ выполнения codeql database analyze
— использовать пакеты CodeQL. Вы также можете выполнить команду с помощью запросов из локального репозитория CodeQL, что может потребоваться, если вы хотите настроить основные запросы CodeQL.
Работает codeql database analyze
При выполнении database analyze
он:
- При необходимости скачивает все указанные CodeQL пакеты, недоступные локально.
- Выполняет один или несколько файлов запросов, выполняя их в базе данных CodeQL.
- Интерпретирует результаты на основе определенных метаданных запроса, чтобы оповещения могли отображаться в правильном расположении в исходном коде.
- Сообщает результаты всех диагностических и сводных запросов в стандартные выходные данные.
Вы можете проанализировать базу данных, выполнив следующую команду:
codeql database analyze <database> --format=<format> --output=<output> <query-specifiers>...
Необходимо указать следующие данные:
<database>
: путь к базе данных CodeQL, которую требуется проанализировать.--format
: формат файла результатов, созданного во время анализа. Поддерживается ряд различных форматов, включая форматы CSV, SARIF и графа. Дополнительные сведения о CSV и SARIF см. в разделе Результаты. Сведения о том, какие другие форматы результатов поддерживаются, см. в справочнике по анализу базы данных.--output
: выходной путь к файлу результатов, созданному во время анализа.
Также можно указать:
-
<query-specifiers>...
: разделенный пробелами список запросов для выполнения в базе данных. Ниже приведен список аргументов, каждый из которых может быть следующим:- Путь к файлу запроса
- путь к каталогу с файлами запросов;
- путь к файлу набора запросов;
- имя пакета запросов CodeQL
- с необязательным диапазоном версий
- с необязательным путем к запросу, каталогу или набору запросов в пакете
Если этот параметр опущен, будет использоваться набор запросов по умолчанию для языка анализируемой базы данных. Полный синтаксис описателей запросов см. в разделе Указание запросов для выполнения в пакете CodeQL.
-
--sarif-category
: идентифицирующие категорию для результатов. Используется при отправке нескольких наборов результатов для фиксации. Например, если вы используетеgithub upload-results
для отправки результатов для нескольких языков в API сканирования кода GitHub. Дополнительные сведения об этом варианте использования см. в разделе Настройка CodeQL CLI в системе CI. -
--sarif-add-query-help
: (поддерживается в версии 2.7.1 и выше) добавляет любую пользовательскую справку по запросам, написанную в markdown, в файлы SARIF (версии 2.1.0 или более поздней версии), созданные в результате анализа. Перед выполнением анализа необходимо преобразовать справку по запросам.md
, хранящуюся в.qhelp
файлах. Дополнительные сведения см. в разделе Включение справки по запросам для пользовательских запросов CodeQL в SARIF-файлах. -
--download
: логический флаг, позволяющий CLI скачивать все указанные CodeQL пакеты, недоступные локально. Если этот флаг отсутствует, а указанный пакет CodeQL недоступен локально, команда завершится ошибкой.
Обновление баз данных
Для баз данных, созданных с помощью CodeQL CLI версии 2.3.3 или более ранней версии, необходимо явно обновить базу данных, прежде чем выполнять анализ с использованием более новой версии CodeQL CLI. Если этот шаг необходим, вы увидите сообщение о необходимости обновления базы данных при запуске database analyze
.
Для баз данных, созданных с помощью CodeQL CLI версии 2.3.4 или более поздней версии, интерфейс командной строки неявно выполняет все необходимые обновления. Явное выполнение команды обновления не требуется.
Полные сведения обо всех параметрах, которые можно использовать при анализе баз данных, см. в справочной документации по анализу баз данных.
Указание запросов для выполнения в пакете CodeQL
Описатели запросов используются и другими командами codeql database analyze
, которые работают с набором запросов.
Полной формой описателя запроса является scope/name@range:path
, где:
-
scope/name
— полное имя пакета CodeQL. -
range
— это диапазон semver. -
path
— это путь файловой системы к одному запросу, каталогу с запросами или файлу набора запросов.
При указании scope/name``range
, и path
являются необязательными. Если опустить range
, используется последняя версия указанного пакета. Если опустить path
, используется набор запросов по умолчанию для указанного пакета.
Может path
быть файлом .ql
запроса, каталогом, содержащим один или несколько запросов, или файлом .qls
набора запросов. Если опустить имя пакета, необходимо указать path
, который будет интерпретироваться относительно рабочего каталога текущего процесса. Шаблоны glob не поддерживаются.
Если указать как , scope/name
так и path
, объект path
не может быть абсолютным. Он учитывается относительно корня пакета CodeQL.
Примеры описателей запросов
-
codeql/python-queries
— Все запросы в наборе запросов по умолчанию последнейcodeql/python-queries
версии пакета. -
codeql/python-queries@1.2.3
— все запросы в наборе запросов по умолчанию версии1.2.3
codeql/python-queries
пакета. -
codeql/python-queries@~1.2.3
— Все запросы в наборе запросов по умолчанию последнейcodeql/python-queries
версии пакета, >=1.2.3
и <1.3.0
. -
codeql/python-queries:Functions
— Все запросы в каталогеFunctions
в последнейcodeql/python-queries
версии пакета. -
codeql/python-queries@1.2.3:Functions
— Все запросы в каталогеFunctions
в версии 1.2.3codeql/python-queries
пакета. -
codeql/python-queries@1.2.3:codeql-suites/python-code-scanning.qls
— Все запросы в каталогеcodeql-suites/python-code-scanning.qls
в версии 1.2.3codeql/python-queries
пакета. -
suites/my-suite.qls
— Все запросы вsuites/my-suite.qls
файле относительно текущего рабочего каталога.
Совет
Набор запросов по умолчанию стандартных пакетов запросов CodeQL — .codeql-suites/<lang>-code-scanning.qls
Несколько других полезных наборов запросов также можно найти в каталоге codeql-suites
каждого пакета. Например, codeql/cpp-queries
пакет содержит следующие наборы запросов:
-
cpp-code-scanning.qls
— Стандартные запросы сканирования кода для C++. Набор запросов по умолчанию для этого пакета. -
cpp-security-extended.qls
— Запросы из набора по умолчаниюcpp-code-scanning.qls
для C++, а также запросы с более низкой серьезностью и точностью. -
cpp-security-and-quality.qls
— запросы изcpp-security-extended.qls
, а также запросы на поддержку и надежность.
Источники для этих наборов запросов можно просмотреть в репозитории CodeQL. Наборы запросов для других языков похожи.
Примеры выполнения анализа базы данных
В следующих примерах показано, как выполняться database analyze
с помощью пакетов CodeQL, а также как использовать локальную извлечение репозитория CodeQL. В этих примерах предполагается, что базы данных CodeQL созданы в каталоге, который является одноуровневой частью локальных копий репозитория CodeQL.
Выполнение одного запроса
Чтобы выполнить один запрос к базе данных CodeQL для базы кода JavaScript, можно использовать следующую команду из каталога, содержащего базу данных:
codeql database analyze --download <javascript-database> codeql/javascript-queries:Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
Эта команда выполняет простой запрос, который находит потенциальные ошибки, связанные с неиспользуемых переменных, импортом, функциями или классами. Это один из запросов JavaScript, включенных в репозиторий CodeQL. Можно выполнить несколько запросов, указав разделенный пробелами список похожих путей.
При анализе создается CSV-файл (js-results.csv
) в новом каталоге (js-analysis
).
Кроме того, если у вас есть репозиторий CodeQL, можно выполнить те же запросы, указав путь к запросу напрямую:
codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
Вы также можете выполнять собственные пользовательские запросы с помощью database analyze
команды .
Дополнительные сведения о подготовке запросов для использования с CodeQL CLI см. в разделе Использование пользовательских запросов с CodeQL CLI.
Выполнение всех запросов в каталоге
Вы можете выполнять все запросы, расположенные в каталоге, указав путь к каталогу, а не список всех отдельных файлов запросов. Поиск путей выполняется рекурсивно, поэтому все запросы, содержащиеся во вложенных папках, также будут выполняться.
Важно
При выполнении database analyze
не следует указывать корень основного пакета запросов CodeQL, так как он может содержать некоторые специальные запросы, которые не предназначены для использования с командой . Вместо этого запустите пакет запросов, чтобы включить стандартные запросы пакета в анализ, или выполните один из наборов запросов для сканирования кода.
Например, чтобы выполнить все запросы Python, содержащиеся в каталоге Functions
в пакете codeql/python-queries
запросов, необходимо выполнить следующее:
codeql database analyze <python-database> codeql/python-queries:Functions --format=sarif-latest --output=python-analysis/python-results.sarif --download
Кроме того, если вы извлекли репозиторий CodeQL, можно выполнить те же запросы, указав путь к каталогу напрямую:
codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif
После завершения анализа создается файл результатов SARIF. Указание --format=sarif-latest
гарантирует, что результаты будут отформатированы в соответствии с последней спецификацией SARIF, поддерживаемой CodeQL.
Выполнение наборов запросов
Чтобы выполнить набор запросов в базе данных CodeQL для базы кода C/C++, можно использовать следующую команду из каталога, содержащего базу данных:
codeql database analyze <cpp-database> codeql/cpp-queries:codeql-suites/cpp-code-scanning.qls --format=sarifv2.1.0 --output=cpp-results.sarif --download
Эта команда скачивает codeql/cpp-queries
пакет запросов CodeQL, выполняет анализ и создает файл в формате SARIF версии 2.1.0, который поддерживается всеми версиями GitHub. Этот файл можно отправить в GitHub, codeql github upload-results
выполнив или API сканирования кода.
Дополнительные сведения см. в разделе Установка CodeQL CLI в системе непрерывной интеграции или Проверка кода.
Наборы запросов CodeQL — это .qls
файлы, использующие директивы для выбора запросов для выполнения на основе определенных свойств метаданных. Стандартные пакеты CodeQL имеют метаданные, указывающие расположение наборов запросов, используемых при сканировании кода, поэтому CodeQL CLI знает, где находить эти файлы набора автоматически, и вам не нужно указывать полный путь в командной строке.
Дополнительные сведения см. в разделе Создание наборов запросов CodeQL.
Сведения о создании пользовательских наборов запросов см. в разделе Создание наборов запросов CodeQL.
Диагностические и сводные сведения
При создании базы данных CodeQL средство извлечения сохраняет диагностические данные в базе данных. Наборы запросов сканирования кода включают дополнительные запросы для создания отчетов по этим диагностическим данным и вычисления сводных метрик. database analyze
После выполнения команды CLI создает файл результатов и передает все диагностические и сводные данные в стандартные выходные данные. Если вы решили создать выходные данные SARIF, дополнительные данные также включаются в файл SARIF.
Если анализ обнаружил меньше результатов для стандартных запросов, чем ожидалось, просмотрите результаты диагностических и сводных запросов, чтобы проверить, является ли база данных CodeQL хорошим представлением базы кода, которую требуется проанализировать.
Интеграция пакета CodeQL в рабочий процесс сканирования кода в GitHub
Пакеты запросов CodeQL можно использовать в настройке сканирования кода. Это позволяет выбирать пакеты запросов, опубликованные различными источниками, и использовать их для анализа кода. Дополнительные сведения см. в разделах Использование пакетов запросов CodeQL в действии CodeQL или Скачивание и использование пакетов запросов CodeQL в системе CI.
Включение справки по запросам для пользовательских запросов CodeQL в файлах SARIF
Если вы используете CodeQL CLI для выполнения анализа сканирования кода в системах CI/CD сторонних производителей, вы можете включить справку по запросам для пользовательских запросов в SARIF-файлах, созданных во время анализа. После отправки ФАЙЛА SARIF в GitHub справка по запросу отображается в пользовательском интерфейсе сканирования кода для всех оповещений, созданных пользовательскими запросами.
Начиная с CodeQL CLI версии 2.7.1, вы можете включить справку по запросам, отрисованную с помощью Markdown, в ФАЙЛЫ SARIF, указав --sarif-add-query-help
параметр при запуске codeql database analyze
.
Дополнительные сведения см. в разделе Настройка CodeQL CLI в системе CI.
Вы можете написать справку по запросам для пользовательских запросов непосредственно в файле Markdown и сохранить ее вместе с соответствующим запросом. Кроме того, для согласованности со стандартными запросами CodeQL можно написать справку по запросам .qhelp
в формате . Справка по запросам, написанная в .qhelp
файлах, не может быть включена в ФАЙЛЫ SARIF и не может быть обработана путем сканирования кода, поэтому ее необходимо преобразовать в markdown перед выполнением анализа. Дополнительные сведения см. в разделах Запрос файлов справки и Тестирование файлов справки запроса.
Результаты
Результаты анализа можно сохранять в различных форматах, включая SARIF и CSV.
Формат SARIF предназначен для представления выходных данных широкого спектра средств статического анализа. Дополнительные сведения см. в разделе Выходные данные SARIF.
Если вы решили создать результаты в формате CSV, то каждая строка в выходном файле соответствует оповещению. Каждая строка представляет собой разделенный запятыми список со следующими сведениями:
Свойство | Описание | Пример |
---|---|---|
Имя | Имя запроса, который идентифицировал результат. | Inefficient regular expression |
Описание | Описание запроса. | A regular expression that requires exponential time to match certain inputs can be a performance bottleneck, and may be vulnerable to denial-of-service attacks. |
Статус | Серьезность запроса. | error |
Сообщение | Оповещение. | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\\\'. |
Путь | Путь к файлу с оповещением. | /vendor/codemirror/markdown.js |
Начальная строка | Строка файла, в которой начинается код, активировав оповещение. | 617 |
Начальный столбец | Столбец начальной строки, помечающий начало кода оповещения. Не включается, если равно 1. | 32 |
Конечная линия | Строка файла, в которой заканчивается код, активировав оповещение. Не включается, если значение совпадает с начальной строкой. | 64 |
Конечный столбец | Если доступно, столбец конечной строки, который отмечает конец кода оповещения. В противном случае конечная строка повторяется. | 617 |
Файлы результатов можно интегрировать в собственную инфраструктуру проверки кода или отладки. Например, выходные данные ФАЙЛА SARIF можно использовать для выделения оповещений в правильном расположении в исходном коде с помощью подключаемого модуля средства просмотра SARIF для интегрированной среды разработки.