AI-ассистент для разметки предупреждений анализатора

Одной из самых трудоемких задач при использовании статического анализатора является разметка предупреждений, поэтому мы исследуем способы упрощения этой работы. В статье описан метод на основе машинного обучения для оценки вероятности истинности предупреждений для языков 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, после сборки и анализа необходимо выполнить следующие действия:

  1. Загрузить с сервера размеченные предупреждения, выполнить дообучение и предсказание.
    svace predict --host host --user user --password password --project project1 --branch master
    
  2. Импортировать и загрузить результаты на сервер.
    svacer import --full-paths --upload --host host --project project1 --branch master 
    

На данный момент дообучение работает корректно только при наличии на сервере размеченных предупреждений, содержащих полные пути, т. е. при импорте результатов требуется использовать опцию --full-paths.

Предсказание отображается в поле “Степень доверия” панели “Подробности” при просмотре предупреждения, как показано на снимке экрана.

Наши планы

Предсказание истинности на основе метрик — лишь начало развития инструментария для упрощения разметки предупреждений. Мы планируем повысить точность предсказаний за счет добавления новых признаков в модель и повышения ее гранулярности, что позволит сократить количество размеченных предупреждений для качественных предсказаний. В настоящее время мы разрабатываем алгоритм для группировки похожих предупреждений по разным критериям, что позволит размечать их вместе.

References

[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.


Валерий Игнатьев