UAST

В ближайшее время в Svace будет добавлен компонент для поиска ошибок на основе унифицированного абстрактного синтаксического дерева (сокращённо UAST).

Мотивация

Инструмент Svace имеет компонент для статического анализа на основе абстрактного синтаксического дерева (АСД) для языков C, C++, Java, Kotlin и Go.

Схема анализа в общем случае устроена следующим образом:

  1. Во время фазы контролируемой сборки происходит запуск компилятора для соответствующего языка, генерирующего АСД для исходной программы;
  2. Полученный АСД анализируется детекторами
    • В случае с языками Java и Kotlin, детекторы реализованы в модифицированных компиляторах этих языков;
    • В случае с Go, используется разработанный нами инструмент Goa;
  3. Предупреждения записываются в файлы в формате svres, которые в дальнейшем импортируются в Svace во время фазы основного анализа.

Эта схема неудобна по следующим причинам:

Для устранения описанных неудобств мы добавляем в анализатор компонент UAST, который будет анализировать унифицированное абстрактное синтаксическое дерева для разных языков.

Устройство UAST анализа

UAST анализ состоит из двух фаз:

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

Использование UAST упрощает добавление новых языков в анализатор. В частности, так как в Svace добавляется поддержка языка Python, то реализация АСД анализа потребовала бы добавления ещё одного языка в вышеприведённую схему.

Анализ оперирует тремя основными сущностями:

На данный момент, UAST анализ реализован для языков Java, Kotlin и Python. В будущем также планируется его реализация для языка Go.

В случае с языками Java и Kotlin, фаза трансляции происходит при помощи плагинов для компиляторов этих языков. Поэтому транслятору известна вся информация, которая известна компилятору — никакая информация не теряется.

Для языка Python, трансляция происходит при помощи модуля стандартной библиотеки ast. Так как в языке используется динамическая типизация, то информация о типах транслятором никак не вычисляется и не используется при анализе.

Ограничения

Анализ на основе унифицированного АСД выполняется в рамках одного файла. Это связано с тем, что данный анализ должен быть быстрым и легковесным.

По этой причине, анализ во многих случаях не способен находить дефекты, причина которых находится в нескольких файлах.


Виталий Афанасьев