Анализатор Svace
Svace — это статический анализатор, разработанный компанией ИСП РАН (Институт системного программирования им. В. П. Иванникова Российской академии наук). Он представляет собой инструмент для обнаружения ошибок и аномалий, включая:
- Ошибки работы с памятью:
- разыменование нулевых указателей (null pointer dereferences);
 - утечки памяти (memory leaks);
 - двойное освобождение памяти (double free);
 - использование освобожденной памяти (use-after-free);
 - выход за границы массива/буфера (buffer overflows/underflows).
 
 - Ошибки конкурентности:
- гонки данных (data races);
 - взаимные блокировки (deadlocks).
 
 - Ошибки безопасности:
- целочисленные переполнения (integer overflows);
 - проблемы с форматированием строк (format string vulnerabilities);
 - небезопасное использование криптографических примитивов.
 
 - Логические ошибки:
- недостижимый код (unreachable code);
 - неиспользуемые переменные (unused variables);
 - неверные условия в циклах и ветвлениях.
 
 - Ошибки API:
- неправильное использование функций стандартных библиотек и сторонних API.
 
 
Svace работает на следующих платформах:
- macOS/x64 (версия 10.10+, язык C# не поддерживается);
 - архитектура x86 (только перехват сборки);
 - Linux/x64 (версия ядра 3.10+, версия glibc 2.17+);
 - Linux/ARM 64 (Ubuntu 18.04);
 - Windows (начиная с Windows 7 SP 1 с обновлением KB2533623);
 - WSL (версий 1 и 2).
 
Существует два варианта использования Svace:
- Приобретение лицензии у ИСП РАН.
 - Использование имеющейся лицензии Svace. Для этого потребуется установить драйвер Sentinel Runtime Environment и подключиться к серверу Svace в организации.
 
Без использования лицензии доступен только перехват сборки проекта.
Сравнение Svace с другими статическими анализаторами, а также рекомендации по выбору статического анализатора приведены на данной странице.
Содержание:
- Предварительные условия для установки
 - Установка Svace и Svacer
 - Сборка и её перехват через Svace
 - Анализ кода
 - Запуск сервера Svacer
 
Предварительные условия для установки
Для работы Svace необходимо предварительно установить следующие компоненты:
- Аврора SDK или Platform SDK;
 - Sentinel Runtime Environment (haslpm) — драйвер для анализа.
 
Установка Аврора SDK или Platform SDK
Установить Аврора SDK или Platform SDK можно по следующим инструкциям:
Установка Sentinel Runtime Environment (haslpm)
Примечание. Без данного драйвера доступен только перехват сборки, а анализ кода производится на другом сервере.
Для запуска анализа кода на дистрибутивах Linux необходимо установить драйвер haslpm от Sentinel.
- 
Скачать архив с драйвером
haslpm. Для этого необходимо перейти в репозиторий Svace Support. Далее из файла README.md перейти по "Постоянной ссылке для скачивания текущей версии", а затем скачать файлSentinel_LDK_Ubuntu_DEB_Run-time_Installer.tar.gzиз директории/Sentinel Runtime. - 
Распаковать архив и запустить данную команду внутри директории, куда архив был распакован:
sudo dpkg -i aksusbd_8.52-1_amd64.deb - 
Перезагрузить компьютер после установки.
 - 
Проверить статус загрузки драйвера и работу сервиса с помощью команды:
sudo systemctl status hasplmd - 
После успешного запуска сервера необходимо создать конфигурационный .ini-файл для драйвера. Требуется предварительно узнать имя сервера от своего администратора для переменной
$SERVER_NAME(используется в параметреserveraddr = $SERVER_NAME). Имя сервера необходимо для проверки лицензии. Итоговая команда выглядит следующим образом:sudo mkdir -p /etc/hasplm sudo touch /etc/hasplm/hasplm.ini sudo bash -c 'echo "accremote = 1" > /etc/hasplm/hasplm.ini && echo "serveraddr = $SERVER_NAME" >> /etc/hasplm/hasplm.ini'Параметр
accremote = 1говорит драйверу, что для лицензии нужен удаленный доступ.Примечание. В дальнейших инструкциях все действия также происходят на локальном компьютере. Каких либо действий на сервере организации, помимо подключения к нему, производить не требуется.
 
После установки драйвера Sentinel Runtime Environment можно проверить его состояние в Sentinel Admin Control Center. Для этого необходимо перейти по адресу http://localhost:1947. В открывшейся панели справа перейти на вкладку "Sentinel Keys" и проверить наличие ключа.
Установка Svace и Svacer
Svace — инструмент разработчика на рабочем месте.
Svacer — сервер для хранения и обработки результатов статического анализа.
В данной инструкции рассмотрен процесс установки Svace на Ubuntu, поставляемого в качестве архива.
Для дистрибутивов, построенных на базе Ubuntu, можно установить Svace из apt-репозитория. По данной ссылке можно найти актуальную версию Svace для Windows и других дистрибутивов Linux, а также ознакомиться с описаниями релизов.
Svacer устанавливается и разворачивается внутри docker-контейнера PostgreSQL.
- 
Cкачать необходимые компоненты. Для этого необходимо перейти в репозиторий Svace Support. Далее из файла README.md перейти по "Постоянной ссылке для скачивания текущей версии", а затем найти и скачать следующие компоненты:
- Svace Linux. Находится внутри директории 
Svace. - Svace SB2. Находится в 
Svace/Aurora. - Svacer Linux. Находится в 
Svace/Svacer. 
 - Svace Linux. Находится внутри директории 
 - 
Выполнить команды распаковки для архивов внутри директории, куда были скачаны данные архивы:
mkdir ~/svace ~/svacer tar -xf svace-4.0.250624-x64-linux.tar.bz2 -C ~/svace --strip-components=1 tar -xf svacer-11-0-0-linux.tar.gz -C ~/svacer --strip-components=1 - 
Добавить пути для Svace и Svacer в переменную
$PATH. Можно добавить их временно, только для текущего окна терминала:export PATH="$PATH:$HOME/svace/bin" export PATH="$PATH:$HOME/svacer/bin"Или же добавить их на постоянной основе, записав в файл
~/.bashrc:echo 'export PATH="$PATH:$HOME/svace/bin"' >> ~/.bashrc echo 'export PATH="$PATH:$HOME/svacer/bin"' >> ~/.bashrcВ последнем случае нужно будет перезагрузить файл
~/.bashrc:source ~/.bashrc 
Сборка и её перехват через Svace
Перед запуском Svace нужно настроить его для перехвата сборки конкретного проекта из рабочей директории Аврора SDK.
Для удобства предварительно рекомендуется определить в терминале следующие переменные:
export WORKSPACE_PATH=<путь до рабочей директории Аврора SDK>
export PROJECT_PATH=<путь до проекта из рабочей директории>
Например, если рабочая директория располагается на рабочем столе, то пути будут выглядеть следующим образом:
export WORKSPACE_PATH=/home/<имя_пользователя>/Desktop
export PROJECT_PATH=/<имя проекта>
- 
Перейти в рабочую директорию Аврора SDK:
cd $WORKSPACE_PATH - 
Создать в ней директорию для Svace, а затем распаковать его туда:
mkdir $WORKSPACE_PATH/svace-aurora tar xf ~/Downloads/svace-4.0.250624-x64-linux-sb2.tar.bz2 -C $WORKSPACE_PATH/svace-aurora --strip-components=1 - 
Создать файл с env-переменными для окружения
sb2:echo "export WORKSPACE_PATH=$(pwd)" > sb2_env.sh echo "export PROJECT_PATH=$(pwd)/$PROJECT_PATH" >> sb2_env.sh echo "export SVACE_PATH=$(pwd)/svace-aurora" >> sb2_env.sh$SVACE_PATH— путь до svace-aurora, который должен находиться в$WORKSPACE_PATH. - 
При использовании Аврора SDK предварительно нужно запустить виртуальную машину Аврора SDK. Затем необходимо авторизоваться в среде сборки и скопировать туда ранее созданный файл:
scp -P 2222 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk sb2_env.sh mersdk@localhost:~ ssh -p 2222 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk mersdk@localhostДля Platform SDK файл не нужно копировать, он будет находиться в той же директории после запуска скрипта с помощью данной команды:
./aurora_psdk - 
Создать переменные среды для окружения:
source sb2_env.sh - 
Перейти в директорию проекта и создать внутри неё директорию
build:cd $PROJECT_PATH mkdir build && cd build - 
Проверить, установлены ли все зависимости для проекта:
mb2 -t $TARGET build-init .. mb2 -t $TARGET prepare ..$TARGET— переменная, содержащая необходимый таргет. Полный список доступных таргетов можно получить с помощью командыsdk-assistant list. - 
Сконфигурировать проект перед сборкой.
Проект с системой сборки qmake:
mb2 -t $TARGET qmake ..Проект с системой сборки cmake:
mb2 -t $TARGET cmake .. - 
Экспортировать путь для Svace под sb2, ранее определённый в переменной
$SVACE_PATH:export PATH="$PATH:$SVACE_PATH/bin" - 
Зайти в окружении
sb2в нужный таргет$TARGETс суффиксом.default:sb2 -t $TARGET.default -m sdk-buildЕсли все шаги выполнены верно, то следующая команда вернёт версию Svace:
svace --version - 
Создать директорию для Svace, где будут храниться необходимые для анализа файлы:
svace initПо умолчанию создаваемая директория имеет название
.svace-dir. Данная директория будет использоваться далее в инструкции. Задать другое название для директории можно с помощью аргумента--svace-dir $DIR_NAME:svace init --svace-dir $DIR_NAME$DIR_NAME— переменная, содержащая имя директории. - 
Собрать проект вместе со Svace.
Проект с системой сборки qmake:
svace build make -BПроект с системой сборки cmake:
svace build ninja -B 
Теперь можно перейти к анализу кода.
Анализ кода
Предварительно необходимо установить драйвер haslpm из архива Sentinel по инструкции выше.
Для проведения анализа необходимо запустить данную команду на целевой машине:
svace analyze --svace-dir .svace-dir
Результаты анализа можно просмотреть на сервере Svacer.
Запуск сервера Svacer
Для просмотра проведенного анализа кода необходимо запустить сервер Svacer из docker-контейнера. Для этого нужно убедиться, что установлены:
- docker;
 - docker-compose.
 
Установка docker описана в данной инструкции.
- 
Перейти в директорию
~/svacer/extra:cd ~/svacer/extra - 
Запустить сервер Svacer:
docker-compose up -dВ дальнейшем его можно остановить с помощью команды:
docker-compose down - 
Авторизоваться в веб-интерфейсе. Для этого нужно перейти по адресу http://localhost:8080. По умолчанию используется логин/пароль: admin/admin:

 - 
Далее нужно загрузить snapshot c анализом кода на сервер. Для этого нужно вернуться в директорию, где находится директория
.svace-dir:cd /home/$USER/$PROJECT_PATH/buildИмпортировать анализ кода для Svacer с помощью данной команды:
svacer import --svace ~/svace/bin/svace .После чего загрузить snapshot на Svacer:
svacer upload - 
Выбрать проект, чтобы просмотреть результаты его анализа. После импорта проект можно будет выбрать его из списка Select project:

В результате анализ кода станет доступным для экспорта из веб-интерфейса:

 
Подробная информация о работе с интерфейсом Svacer доступна по ссылке.