﻿# Использование PVS\-Studio в SourceCraft

SourceCraft — платформа, с помощью которой можно разрабатывать исходный код, управлять версиями, тестировать, собирать, развёртывать и сопровождать программные продукты\. Сервис представляет собой систему управления репозиториями кода для Git с отслеживанием ошибок и пайплайном CI/CD\.


> В документации рассматривается пример по интеграции PVS\\\-Studio для анализа C и C\\\+\\\+ кода\\\. Команды запуска PVS\\\-Studio для анализа C\\\# или Java кода будут отличаться\\\. Подробности в соответствующих разделах документации: "\[Проверка проектов Visual Studio / MSBuild / \\\.NET из командной строки с помощью PVS\\\-Studio\]\(https://pvs\-studio\.ru/ru/docs/manual/0035/\)" и "\[Работа с ядром Java анализатора из командной строки\]\(https://pvs\-studio\.ru/ru/docs/manual/6703/\)"\\\.

## Запуск анализа

### Автоматический запуск анализа

Сначала необходимо включить сканирование кода\. Для этого нужно перейти в раздел **Настройки репозитория \> Безопасность**\. Подробнее про настройку SourceCraft написано в [документации](https://sourcecraft.dev/portal/docs/ru/)\.

![SourceCraft_ru/image1.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image1.png)

После необходимо добавить новый Workflow\. Для этого добавьте YAML\-скрипт в директорию `.sourcecraft`/`.workflows` репозитория\. После этого каждый коммит и каждый новый pull request в ветку по умолчанию будут автоматически проверяться\.

Рассмотрим следующий пример скрипта `ci.yaml`, который позволяет полностью проверить проект с помощью PVS\-Studio:

```cpp
on:
  pull_request:
    - workflows: [ pvs-studio-pipeline ]
      filter:
        source_branches: [ "**" ]
        target_branches: [ "main", "develop" ]

  push:
    - workflows: [ pvs-studio-pipeline ]
      filter:
        branches: [ "main", "develop" ]

workflows:
  pvs-studio-pipeline:
    tasks:
      - name: pvs-studio-cpp-analysis
        cubes:
          - name: run-pvs-studio-analysis
            image:
              name: sourcecraft/pvs-studio-cpp
            script:
              - |       
                cd $SOURCECRAFT_WORKSPACE

                # Ввод лицензии PVS-Studio
                pvs-studio-analyzer credentials $PVS_STUDIO_CREDENTIALS
                
                # Сборка проекта
                cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On -B build .
                cmake --build build -j
                  
                # Запуск анализа PVS-Studio
                pvs-studio-analyzer analyze -f build/compile_commands.json -j
                
                # Конвертация отчет в формат SARIF
                plog-converter -t sarif \
                               -o $SOURCECRAFT_WORKSPACE/result.sarif \
                               -r $SOURCECRAFT_WORKSPACE \
                               -R toRelative \
                               PVS-Studio.log
            env:
              PVS_STUDIO_CREDENTIALS: ${{ secrets.PVS_STUDIO_CREDENTIALS }}

          # Загрузка результатов работы анализатора
          - name: upload-sarif-to-sourcecraft
            image:
              name: sourcecraft/scan-result-uploader:0.6.0
            script:
              - export APPSEC_CUSTOM_ENGINE_NAME="PVS-Studio"
              - export APPSEC_CUSTOM_ENGINE_TYPE="SAST"
              - /app/bin/scan-result-uploader
```

Поле `workflows` описывает, какие процессы будут запущены\.

Поле `target_branches` хранит целевые ветки\.

Поле `pull_request` означает, что анализ будет запускаться при открытии/обновлении pull request\.

Поле `push` означает, что анализ запустится при прямом коммите в ветки\. Также можно настроить, чтобы анализ осуществлялся по расписанию с помощью поля `schedule`\.

Поле `name` задаёт название шага\.

Далее идёт последовательность шагов `script`, которые выполняют некоторые действия или последовательность команд оболочки\.

После установки нужно ввести лицензию PVS\-Studio\. Для её активации используется шифрованная переменная `PVS_STUDIO_CREDENTIALS`, которая содержит имя пользователя и ключ\.

Чтобы создать секрет, перейдите во вкладку **Настройки репозитория \> Секреты** и нажмите кнопку **Новый секрет**\.

![SourceCraft_ru/image2.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image2.png)

Шаг `pvs-studio-cpp-analysis` запускает анализатор PVS\-Studio и сохраняет отчёт в формате SARIF в `$SOURCECRAFT_WORKSPACE/result.sarif`\. 

```cpp
pvs-studio-analyzer analyze -f build/compile_commands.json -j               
                
plog-converter -t sarif -o $SOURCECRAFT_WORKSPACE/result.sarif PVS-Studio.log 
-r $SOURCECRAFT_WORKSPACE -R toRelative
```

Более подробно о параметрах запуска `pvs-studio-analyzer` описано в [документации](https://pvs-studio.ru/ru/docs/manual/0036/), а о параметрах plog\-converter в [этой документации](https://pvs-studio.ru/ru/docs/manual/0038/)\.

Шаг `upload-sarif-to-sourcecraft` загружает результаты работы анализатора на платформу\. Результат анализа можно посмотреть на вкладке **Безопасность \> Анализ кода**\.

![SourceCraft_ru/image3.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image3.png)

### Ручной запуск анализа

Для ручного запуска пайплайна нужно написать скрипт в файл `ci.yaml` или использовать скрипт, описанный выше\. После этого перейти в раздел **Автоматизации \> CI/CD** и нажать кнопку **Новый запуск**\. После этого произойдёт запуск пайплайна\.

![SourceCraft_ru/image4.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image4.png)

## Работа с SARIF\-отчётами

В разделе **Анализ кода** можно отфильтровать срабатывания по статусу:

* открыт; 
* решён; 
* ложное срабатывание\. 

Важности: 

* критический;
* высокий;
* средний;
* низкий\.

 И типу сканера\. Для этого нужно выбрать необходимые параметры в строке фильтра\.

![SourceCraft_ru/image5.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image5.png)

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

![SourceCraft_ru/image6.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image6.png)

Также здесь можно перейти к исправлению ошибки, нажав на кнопку **Редактировать**, и написать комментарий по работе со срабатыванием\.

В случае, если срабатывание оказалось ложным, можно отметить его\. Для этого нужно нажать на кнопку **Решить** и отметить срабатывание ложным\. 

![SourceCraft_ru/image7.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image7.png)

После подтверждения появится запись об изменении статуса срабатывания\.

![SourceCraft_ru/image8.png](https://import.viva64.com/docx/blog/SourceCraft_ru/image8.png)