Анализатор 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 и Svacer
- Сборка и её перехват через Svace
- Анализ кода
- Запуск сервера Svacer
Предварительные условия для установки
Для работы Svace необходимо предварительно установить следующие компоненты:
- Аврора SDK или Platform SDK;
- Sentinel Runtime Environment (haslpm) — драйвер для анализа.
Установка Аврора SDK или Platform SDK
Установить Аврора SDK или Platform SDK можно по следующим инструкциям:
Установка Sentinel Runtime Environment (haslpm)
Примечание. Без данного драйвера доступен только перехват сборки, а анализ кода производится на другом сервере.
Для запуска анализа кода на дистрибутивах Linux необходимо установить драйвер haslpm
от Sentinel.
-
Скачать архив с драйвером по ссылке.
-
Распаковать архив и запустить данную команду внутри директории, куда архив был распакован:
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. С другими вариантами установки, в том числе для Windows, можно ознакомиться по ссылке.
-
Cкачать необходимые компоненты по ссылкам:
-
Выполнить команды распаковки для архивов внутри директории, куда были скачаны данные архивы:
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
Проект с системой сборки cmake:
svace build ninja
Теперь можно перейти к анализу кода.
Анализ кода
Предварительно необходимо установить драйвер 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 доступна по ссылке.