Известные кейсы (Svace)

1. Лицензирование и Sentinel

Проблема

Решение

Sentinel key not found (H0007)

Установить Sentinel Runtime; проверить, что ключ виден в Sentinel ACC; проверить ~/.hasplm/hasp_<vendor>.ini; проверить порт 1947

Too many concurrent users (H0038) — при запуске анализа все лицензии заняты

Уменьшить число параллельных анализов или докупить лицензии. По умолчанию svace analyze встаёт в очередь и висит, пока ключ не освободится. В CI это плохо - job может висеть до таймаута. Чтобы этого не было, задать переменную окружения SVACE_LIC_NO_WAIT=1: тогда svace analyze не будет ждать, а сразу завершится с ошибкой, и CI-job упадёт с понятной причиной  

Outdated USB license key detected

Обновить прошивку ключа утилитой: https://nextcloud.ispras.ru/index.php/s/TCxi3AiSrfweiZJ. Рядом с архивом - инструкция; в качестве почты для кода обновления указать свой адрес

Лицензия не находится в другой подсети

В ~/.hasp/hasp_####.ini указать serveraddr = <IP>; либо в Sentinel ACC → Configuration → Access to Remote License Managers → Aggressive Search; открыть TCP/UDP 1947


Анализ идёт медленно (в разы дольше обычного), хотя ресурсов хватает


Если при запуске есть предупреждение Outdated license key detected, обновить прошивку ключа. Svace использует старую схему проверки лицензии и не запускает анализ в несколько потоков. Обновить прошивку ключа утилитой: https://nextcloud.ispras.ru/index.php/s/TCxi3AiSrfweiZJ  

Не получается обновить программный ключ в закрытом контуре 

Для обновления программного ключа нужен выход в интернет до сервера ИСП РАН. Если контур закрытый - обновление невозможно, нужно запрашивать новый ключ или выходить через прокси  

Анализ проекта на Java 25 не работает

Svace поддерживал Java до 21 включительно. Поддержка Java 25 добавлена только в 6.0.260714. Обновить до 6.0.260714

Не перехватывается сборка проекта на .NET 10 / C# 14 (Assembled build object: null)


В старых дистрибутивах .NET 10 не поддерживается. Обновить до 6.0.260714

Падает сборка проекта на Kotlin 2.2 / 2.3 (перехват не срабатывает)

Поддержка Kotlin до 2.3.10 включительно появилась в 6.0.260714. Обновить до 6.0.260714


Как читать лицензию

Что записано в ключе. В ключе Sentinel может быть до трёх компонентов:

  • Компонент 1 — это Svace. Есть компонент 1 → svace analyze работает.
  • Компонент 3 — анализ C#. Работает только в составе Svace, отдельно не запускается.
  • Компонент 0 — служебный, к продуктам ИСП РАН отношения не имеет.

Как смотреть. Все данные по ключу — в Sentinel Admin Control Center (http://localhost:1947). Там видно: какие компоненты есть, сколько лицензий, до какой даты действуют.

Срок действия — тот, что записан в ваш ключ под ваш заказ. У разных организаций он разный, смотреть нужно в графе Expiration у соответствующего компонента.

Как считаются лицензии:

  • Считаются компьютеры (станции), а не процессы и не запуски.
  • Одна лицензия = один компьютер одновременно. На нём можно параллельно запускать сколько угодно анализов.
  • Виртуальные машины и контейнеры = отдельные компьютеры.
  • Две лицензии = два компьютера одновременно, три = три и т.д.
  • Лицензия нужна только на svace analyze. svace build и работа с Svacer лицензию не требуют.
  • Доступ к лицензии возможен и локально, и удалённо, в том числе через RDP.


2. Перехват сборки (svace build)

Проблема

Решение

Assembled build object: null — Svace не создал объект сборки, дальше svace analyze не может запуститься. В логе также может быть 0 Java units are ready или no C/C++ compilation commands identified

Причин несколько, проверять по порядку:

• Сборка без реальных компиляций — добавить --captured-nothing-status=0, чтобы это не считалось ошибкой

• Сборка идёт из кэша — --no-build-cache, make clean, clean assembleRelease

• Сборка через демон — --no-daemon (для Gradle), собирать из командной строки, не из IDE

• Компилятор не распознан — прислать лог перехвата специалистам 

Сборка Gradle не перехватывается — в логе No compilation activity has been detected, Assembled build object: null; Gradle использует демон или кэш, Svace не видит реальных компиляций

Рабочая команда:

svace build --init ./gradlew clean <task> --no-build-cache --no-configuration-cache --no-daemon -Dorg.gradle.workers.max=1

Для Android — ./gradlew clean assembleRelease. Важно: использовать ту же обёртку ./gradlew, что и в обычной сборке, а не системный gradle

Hash server returned non-zero exit code 1 — при сборке падает хеш-сервер Svace, объект сборки не формируется

Причина — кириллица в путях к проекту. Переименовать папки, чтобы в пути не было русских букв 

Could not find last build object — svace analyze не находит объект сборки, хотя svace build вроде бы завершился

Проверить, что в команде нет --disable-hash-server — она отключает создание объекта сборки. Если проблема остаётся — проверить кириллицу в путях. Убедиться, что svace build и svace analyze запускаются одной и той же версией

Too many open files при перехвате большой сборки (Clickhouse, крупные C++ проекты). Даже с ulimit -n 524288 сборка падает с random_device failed to open /dev/urandom



 Проверить ulimit -Sn, ulimit -Hn, /proc/sys/fs/file-max, количество открытых файлов, запуск в Docker/на хосте. При необходимости проверить внешний .svace-dir и параметры лимитов. Если проблема сохраняется — передать полный лог и параметры окружения специалистам.

 

Перехват на MacOS / iOS — нет готового дистрибутива под arm64

Использовать дистрибутив svace-6.0.260714-x64-darwin.tar.bz2 через трансляцию Rosetta 2. Может потребоваться настройка System Integrity Protection (см. wiki )

Компиляции через ECJ не перехватываются — сборка проходит, но Svace не видит компиляций в части проекта  

Добавить флаг перехвата ECJ-компилятора: svace build --enable-ecj-interception 

C#: Annotations.db повреждён — при сборке C# проекта возникает ошибка десериализации, анализ падает с JsonReaderException

Появляется, если дистрибутив распаковывали на macOS: вместе с файлами копируются скрытые ._* (resource fork). Удалить: find /path/to/svace/cscc -name '._*' -exec rm '{}' \;

ccache мешает перехвату — Svace не видит компиляций, потому что их отдаёт ccache

Svace сам выставляет CCACHE_DISABLE=1 при запуске svace build, то есть ccache автоматически отключается. Если всё равно не работает — очистить ccache вручную (ccache -C)

Перехват сборки на Windows замедлен — перехват длится значительно дольше обычной сборки

Причина — предкомпилированные заголовки (PCH) большого размера, известная проблема Svace на Windows. Временно отключить PCH в проекте и сравнить время

--light ухудшает анализ — не находятся дефекты, которые раньше находились (например, INTEGER_OVERFLOW)

Опция --light отключает символьное исполнение и оставляет только быстрый анализ по AST-шаблонам. Часть типов предупреждений при этом не ищется. Использовать --light только когда действительно нужно быстро; для полного анализа убрать


3. Анализ (svace analyze)

Svace analyzer exited with code -9 — анализ падает, в системном логе (dmesg) видно, что процесс убит OOM-killer'ом. Обычно на больших проектах или при большом числе потоков

 Не хватает оперативной памяти. Что делать по порядку:


• Уменьшить число потоков анализа: THREAD_NUMBER=8 в config/settings.txt дистрибутива

• Включить покомпонентный анализ: svace analyze --set-config ANALYZE_BY_COMPONENTS=true

• Для C# (SharpChecker) — ограничить потоки: svace analyze --sharpchecker-opts="--thread-number;8"

• Добавить RAM на машине анализа

SharpChecker (анализ C#) падает с ошибкой памяти — SharpChecker analysis failed ... CSCC exited with non-zero code 137. В .svace-dir/analyze-res/cscc видны ошибки

Ограничить потоки SharpChecker (он не берёт число потоков из настроек Svace, только из команды):

svace analyze --sharpchecker-opts="--thread-number;8"

Логи анализатора C# — в .svace-dir/analyze-res/cscc

XML syntax error: illegal character U+0001 — анализ падает при импорте/обработке результатов, в исходниках есть управляющие символы

Запретить Unicode в результатах:

svace analyze --set-config ALLOW_UNICODE_IN_RESULTS=false

File objects must be present in git pool before directory assembling — внутренняя ошибка Svace при удалённом анализе, задача висит, объект сборки не формируется

Обновить до 6.0.260714. 

Анализ падает по памяти после обновления Svace — на версиях до 5.0.260525 включительно падал на больших C++ проектах

Обновить до 6.0.260714. В новой версии улучшена работа с памятью. Дополнительно можно включить покомпонентный анализ: svace analyze --set-config ANALYZE_BY_COMPONENTS=true

Анализ идёт долго, нужно ускорить повторные прогоны

Включить кэш: svace analyze --with-cache. Настройка сохраняет результаты между запусками и ускоряет повторный анализ. Инкрементальный анализ (только изменённые файлы) не поддерживается

Результаты анализа отличаются при одном и том же коде — например, DEREF_OF_NULL.RET.STAT то появляется, то исчезает

Причины две:

• Проверить USE_DEVIRTUALIZATION: установить в false и переанализировать

• .STAT-чекеры статистические — их срабатывания зависят от контекста всего проекта: если в других местах добавились проверки, порог срабатывания меняется. Это ожидаемое поведение, не баг

Срабатывания .STAT-чекеров «прыгают» от запуска к запуску

Особенность статистических чекеров: они собирают данные по всему проекту и могут изменить вердикт, если в других файлах добавились проверки. Если не нужны — можно отключить конкретный .STAT-чекер или всю группу

Нужно, чтобы одинаковые срабатывания группировались в одно (например, DEREF_OF_NULL.RET.STAT по одному и тому же коду)

Настроить через svace config:

• GROUP_RESULTS_OF_STAT_CHECKERS — для всех группируемых чекеров сразу

• GROUP_RESULTS_OF_<CHECKER> — для конкретного типа

После изменения — перезапустить анализ

Unsupported class file major version 68 — при анализе Java-проекта падает на новой версии байткода

Обновить Svace до 6.0.260714 — в нём добавлена поддержка новых версий Java (вплоть до 25). Если обновиться пока нельзя — временно использовать Java 21 или попробовать svace build --disable-java-agent

export-build падает — при экспорте объекта сборки возникает ошибка

Убрать опцию svace export --move true — без неё экспорт проходит. Исправлено в 5.0.260525

SARIF: нет поля level — в отчёте не видно критичности предупреждений

Обновить до 6.0.260714 — там level устанавливается. (Минимально достаточно 5.0.260303). Важно: для критичности warning поле может не указываться явно — это соответствует стандарту SARIF (там warning — значение по умолчанию)

Нужно выполнять анализ с учётом классификации предупреждений по ГОСТ Р 71207-2024  

Включить только «гостовские» типы предупреждений:

svace warning all false && svace warning gost true

Рекомендуется дополнить критическими:

svace warning all false && svace warning critical true && svace warning gost true

//svacer_review: - не подавляет предупреждение — комментарий без указания типа не работает

Указывать тип предупреждения явно:

//svacer_review: -INTEGER_OVERFLOW

Убедиться, что включена настройка SUPPRESS_BY_COMMENT=true. Временное решение — использовать //nolint

Подавление предупреждений не работает вообще — комментарии в исходниках не учитываются


Установить SKIP_READ_SOURCE_COMMENTS=false перед анализом. В версии 5.0.260212 эта настройка была true по умолчанию и отключала обработку любых комментариев; в 5.0.260414+ возвращена в false

4. Сервер удалённого анализа

Проблема

Решение

Can not find svace distro for version: '<версия>' при запуске svace remote analyze — сервер не находит дистрибутив нужной версии

На сервере удалённого анализа добавить дистрибутив нужной версии:

svace server admin remote-add-distro --name main --path /path/svace-<версия>-x64-linux

После этого сервер сможет принимать задачи от клиентов этой версии. Из коробки сервер работает только с той версией, что на нём самом

File objects must be present in git pool before directory assembling при запуске svace remote analyze — задача не создаётся

Обновить и клиент, и сервер до 6.0.260714. В версиях до 5.0.260525 ошибка присутствовала. Дополнительно — очистить .svace-dir на клиенте и перезапустить сервис

Задача висит, но в очереди на сервере её нет — анализа не происходит. В логе сервера могут быть ошибки GitObjectPool

Обновить до 6.0.260714. В старых версиях задача не создавалась на сервере. Дополнительно — очистить .svace-dir и перезапустить сервис удалённого анализа

Cannot obtain absolute access to given directory при запуске анализа или очистке — сервер не может получить доступ к папке

Перезапустить сервис удалённого анализа. Проверить, что у пользователя сервиса есть права на папку сервера. Убедиться, что путь к папке сервера не менялся

Сервер не тянет параллельные анализы — при запуске сразу нескольких задач анализ падает или идёт крайне медленно

Ограничить число одновременных анализов: svace server-config SIMULTANEOUS_ANALYSES_LIMIT 1. Задачи пойдут по очереди, но стабильно. Анализ масштабируется почти линейно, суммарное время изменится не сильно

Ошибки call stack или некорректные результаты — svace build и svace analyze запущены разными версиями Svace

Использовать одну и ту же версию Svace для svace build и svace analyze. Объект сборки несовместим между версиями. Если нужны разные версии клиентов — использовать remote-add-distro

Нет текстового файла с результатами после удалённого анализа

Это нормальное поведение. При удалённом анализе формируется только svres, который затем импортируется в Svacer. Текстовый отчёт формируется только при локальном анализе

5. CI/CD и интеграция

Проблема

Решение

Нужно встроить Svace в Jenkins 

Готовых универсальных манифестов нет — Svace требует явного указания команды сборки под каждый проект. Рабочая схема:

• В Jenkinsfile использовать Docker-образ с Ubuntu (glibc) и установленным Svace

• Стадии: svace build --init <команда сборки> → svace analyze → svacer import

• На MR — только build + analyze, на релиз — полный цикл с загрузкой в Svacer

Не получается автоматически определить язык проекта

Автоопределения языка нет. Команду сборки нужно указывать явно в Jenkinsfile под конкретный проект. Для скриптовых языков (Python, JavaScript) вместо команды сборки указывать папки с исходниками:

svace build --python <путь к бэкенду> --javascript <путь к фронтенду>

В образе на Alpine Svace не работает

Alpine использует musl-libc, Svace и Svacer требуют glibc. Использовать Ubuntu (например, ubuntu:22.04-slim) или Debian-производные. Официального Docker-образа Svace в публичных реестрах нет — установка через APT-репозиторий ИСП РАН: apt-get install svace svacer

svace predict не работает с LDAP — при запуске svace predict не проходит аутентификация через LDAP

Поддержка добавлена в 5.0.260414 (есть в 6.0.260714). Использовать:

• опцию --ldap_server <имя из конфига>

• переменные окружения SVACER_LDAP_SERVER (адрес/имя сервера) и SVACER_AUTH_CREDS (логин и пароль в формате login:password)

Нужно получить только новые предупреждения в CI, чтобы не разбирать весь отчёт

Использовать quick-stats или quality-gate при импорте результатов в Svacer. Они позволяют получить список новых предупреждений прямо в задаче CI/CD

Нужен отчёт в формате SARIF для загрузки в ASOC-систему


Два способа:

• Локально, без Svacer — svace svres2sarif конвертирует .svres в SARIF-файл сразу после svace analyze

• Из Svacer — svacer sarif2 export выгружает SARIF из уже загруженных на сервер результатов

Файлы немного по-разному соответствуют стандарту SARIF: у второго способа больше настроек