Известные кейсы (Svace)
1. Лицензирование и Sentinel
Проблема
|
Решение
| |
|
Установить Sentinel Runtime; проверить, что ключ виден в Sentinel ACC; проверить ~/.hasplm/hasp_<vendor>.ini; проверить порт 1947
| |
|
Уменьшить число параллельных анализов или докупить лицензии. По умолчанию 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. Рядом с архивом - инструкция; в качестве почты для кода обновления указать свой адрес
| |
Лицензия не находится в другой подсети
|
| |
|
Если при запуске есть предупреждение 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 не поддерживается. Обновить до 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 запускаются одной и той же версией
| |
| Проверить 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
| |
| Два способа: • Локально, без Svacer — svace svres2sarif конвертирует .svres в SARIF-файл сразу после svace analyze • Из Svacer — svacer sarif2 export выгружает SARIF из уже загруженных на сервер результатов Файлы немного по-разному соответствуют стандарту SARIF: у второго способа больше настроек
|