Одной из самых трудоемких задач при использовании статического анализатора является разметка предупреждений, поэтому мы исследуем способы упрощения этой работы. В статье описан метод на основе машинного обучения для оценки вероятности истинности предупреждений для языков C, C++, Java и С#.
Предсказание вероятности истинности предупреждения основано на классификации предупреждений на истинные или ложные с помощью машинного обучения. Классификатор обучен на датасете из размеченных предупреждений, который мы используем в процессе разработки svace. Кроме того, модель может дообучаться на размеченных предупреждениях анализируемого проекта, т. е. в процессе работы у пользователя, что очень важно и существенно повышает точность предсказания.
В качестве признаков для обучения классификатора используются
метрики исходного кода. Мы
реализовали сбор таких метрик для языков C++, Java, C#. Например, для предсказания
истинности C#-предупреждений используется 45 метрик для функций, таких как количество
строк кода, цикломатическая сложность, количество длинных строк; 50 метрик для
классов, например, количество неиспользуемых членов, глубина наследования, средняя и
максимальная цикломатическая сложность функций класса, связность; 27 метрик для
файлов, как например, количество рекурсивных функций, количество глобальных
переменных и 20 метрик для каталогов, которые в основном агрегируют метрики для
файлов. Совокупность всех метрик вместе формирует вектор признаков. Такой вектор
строится для каждого предупреждения анализатора на основе метрик функции, класса,
файла и директории, содержащих предупреждение. Собранные метрики преобразуются в
векторы признаков во время импорта результатов в сервер истории или upload в Svacer и
используются как для дообучения модели, так и для генерации предсказаний. Информация
о том, истинное предупреждение или нет, получается из сервера истории анализа или
Svacer. Если размеченные предупреждения для данного проекта отсутствуют, то
предсказание выполняется на основе предварительно обученной модели, поставляемой с
анализатором.
Подробности о работе метода можно прочитать в нашей статье [1].
К сожалению, размечать все равно придется. Несмотря на то, что в анализатор включена предварительно обученная модель, этого недостаточно для высокой точности предсказания на ваших проектах. Как показывают наши исследования, если есть 20% размеченных предупреждений на наборе проектов из 5.5 млн. строк кода на C#, то точность предсказания достигает более 90%. Однако если размечено менее 10% предупреждений в проекте, то точность становится сравнима с точностью детекторов в анализаторе и пользы от предсказаний заметно меньше.
Для предсказания требуются метрики, которые раньше не вычислялись. Для языков Java и
C# их построение почти незаметно, однако для C, C++ необходим сбор и сохранение
дополнительной информации во время сборки (svace build
), что увеличивает размер
файлов с биткодом (.svace-dir
) и может приводить к увеличению времени работы.
Само предсказание и дообучение требуют незначительное по сравнению с анализом
количество времени и ресурсов.
В релизе 4.0 мы рассматриваем эту функциональность как экспериментальную и она может не полностью поддерживаться, например, в Svacer, и иметь неизвестные нам ошибки, о которых вы можете нам сообщить. Ждём обратной связи, чтобы в следующем обновлении решить все проблемы и, возможно, включить предсказание по умолчанию.
Для тестирования необходимо разрешить сбор метрик, добавив в команды
сборки (svace build
) и анализа (svace analyze
) флаг --enable-scra
.
При импорте результатов анализа на удалённый встроенный сервер истории
(svace remote history import
) будет автоматически проведено дообучение на имеющихся
на сервере данных и предсказание, результаты которого можно просмотреть на сервере.
Предсказанная вероятность истинности предупреждения отображается в виде процентов в
правом верхнем углу предупреждения и может быть использована для сортировки
предупреждений внутри каждого типа при помощи флажка “Упорядочить по trustRank”.
При использовании локального сервера
(svace history import
+ svace server single-start
или svace show
) предсказание
автоматически не запускается, так как предполагается, что в таком сценарии
использования на сервере нет данных для дообучения (размеченных предупреждений).
Чтобы использовать предсказание с сервером Svacer версии не ниже 10.0, после сборки и анализа необходимо выполнить следующие действия:
svace predict --host host --user user --password password --project project1 --branch master
svacer import --full-paths --upload --host host --project project1 --branch master
На данный момент дообучение работает корректно только при наличии на сервере
размеченных предупреждений, содержащих полные пути, т. е. при импорте результатов
требуется использовать опцию --full-paths
.
Предсказание отображается в поле “Степень доверия” панели “Подробности” при просмотре предупреждения, как показано на снимке экрана.
Предсказание истинности на основе метрик — лишь начало развития инструментария для упрощения разметки предупреждений. Мы планируем повысить точность предсказаний за счет добавления новых признаков в модель и повышения ее гранулярности, что позволит сократить количество размеченных предупреждений для качественных предсказаний. В настоящее время мы разрабатываем алгоритм для группировки похожих предупреждений по разным критериям, что позволит размечать их вместе.
[1] Tsiazhkorob U. V., Ignatyev V. N. Classification of Static Analyzer Warnings using Machine Learning Methods //2024 Ivannikov Memorial Workshop (IVMEM). – IEEE, 2024. – С. 69-74.