Современные программные системы становятся все более сложными, что требует использования эффективных методов анализа и оптимизации кода. Одним из таких методов является анализ потока данных, который позволяет отслеживать поток данных через программу и выявлять потенциальные проблемы, такие как неинициализированные переменные, мертвый код и утечки памяти. Анализ потока данных играет ключевую роль в оптимизации компиляторов, статическом анализе кода и обеспечении безопасности приложений.
Язык программирования Go, разработанный компанией Google, приобретает все большую популярность благодаря своей простоте, эффективности и удобству использования. Эти характеристики делают Go отличным выбором для реализации систем анализа кода, включая анализ потока данных. Несмотря на обилие инструментов для других языков программирования, область анализа потока данных для Go еще недостаточно исследована, что создает возможность для разработки новых подходов и инструментов.
В данной работе будет рассматриваться реализация анализа потока данных для проектов, написанных на языке Go. В качестве инструмента для анализа потока данных будет использована Java Compilation Database (JacoDB [15]). Это специализированная база данных, созданная для эффективного анализа и обработки байт-кода JVM. Она объединяет возможности анализа байт-кода с функциями базы данных, предлагая инструменты для разбора, анализа, модификации и хранения информации о Java-коде.
Также в данной работе будет представлен инструмент для переноса структур данных из Go кода в Kotlin код, будет измерена его производительность, а также предложены дальнейшие способы оптимизации.
Будет представлен способ применения полученного представления внутри символьного интерпретатора языка Go поверх универсальной символьной виртуальной машины (USVM [3]), а также продемонстрировано улучшение в производительности.
В главе 1 будет произведен обзор предметной области, будут даны основные определения, цели и способы достижения данных целей. Также будут рассмотрены существующие продукты для последующего сравнения производительности. В главе 2 будут описаны разработанные в рамках этой работы инструменты, а также направления для их дальнейшего улучшения. Результаты применения полученных инструментов, а также их производительность будут описаны в главе 3.
В рамках данной работы было изучено несколько подходов к написанию символьных интерпретаторов. Были изучены инструменты: USVM, JacoDB, а также GoSec, govulncheck. Также были изучены подходы к реализации анализа потока данных для программ на языке Go.
Были изучены подходы к общению между разными языками: межъязыковое сообщение при помощи JNA и генерация структур на другом языке с дальнейшей сериализацией и десериализацией данных. Также было произведено сравнение производительности между ними.
Был поддержан язык Go для JacoDB. Проект был назван JacoDB-Go.
Получен инструмент для переноса любых структур из Go в Kotlin: GoToKotlin. На его работе основывается перенос SSA промежуточного представления в JacoDB-Go промежуточное представление, что является частью работы USVM-Go. GoToKotlin все еще можно оптимизировать, например, поддержать инкрементальное обновление.
На основе JacoDB-представления был получен инструмент для анализа потока данных. В рамках данной работы он был представлен задачей поиска загрязнений кода. Одними из плюсов данного инструмента являются простота и гибкость. Пользователь может задавать свои собственные конфигурации под свои нужды. Таким образом, анализатор сможет искать и пользовательские уязвимости, а не только те, что были поддержаны разработчиками. Было проведено сравнение производительности полученного анализатора с существующими продуктами: gosec и govulncheck.