Go: исключение из анализа недостижимых процедур

В релизе Svace 4.0.250113 мы ускорили анализ Go.

Мотивация

Go-проекты, как правило, импортируют много внешних пакетов (зависимостей). Под “зависимостями” в Go подразумеваются пакеты, расположенные в каталоге vendor, $GOMODCACHE или $GOPATH/pkg/mod. В некоторых проектах анализ кода зависимостей может занимать даже больше времени, чем анализ пользовательского кода.

Анализ кода зависимостей помогает лучше понимать семантику пользовательских процедур. Найденные ошибки в импортируемых внешних процедурах надо учитывать, несмотря на то что пользователь не всегда может их исправить. Ошибки в коде зависимостей также делают уязвимым код пользователя, который эти процедуры импортирует.

Часто пользовательский код не использует большинство процедур из импортированных пакетов. Для ситуации, когда процедура из кода зависимости недостижима (т.е. процедура не вызывается в пользовательском коде), можно исключить такие процедуры из анализа. Это позволит значительно увеличить скорость анализа и не повлияет на его точность.

Мы реализовали поиск недостижимых процедур в коде зависимостей. Чтобы исключить такой код из процесса анализа необходимо использовать опцию SKIP_UNREACHABLE_PROCEDURE_ANALYSIS.

Особенности

Эта опция имеет три возможных значения:

Чтобы включить опцию необходимо выполнить следующую команду:

svace config SKIP_UNREACHABLE_PROCEDURE_ANALYSIS deps

В обновлении эта опция выключена по умолчанию, т.к. обновление не предполагает значительных изменений у пользователя. В релизе Svace 5.0 мы планируем включить данную опцию по умолчанию с значением deps.

Замеры времени работы

Ниже приведены результаты сравнения времени анализа с значением deps. Ускорение времени анализа зависит от количества зависимых пакетов, используемых проектом.

kubernetes (HEAD -> release-1.29)

KLOC: 5703

Обычный анализ: 480 секунд

Анализ с опцией deps: 240 секунд

Ускорение в 2 раза.

Набор из 5 проектов на Go

KLOC: 7808

Обычный анализ: 800 секунд

Анализ с опцией deps: 260 секунд

Ускорение в 3 раза.

Заключение

Мы рекомендуем включать опцию SKIP_UNREACHABLE_PROCEDURE_ANALYSIS deps, это позволит уменьшить время анализа, а также уменьшить количество предупреждений, которые к пользовательскому проекту не относятся.


Варвара Дворцова