RUS  ENG
Полная версия
ЖУРНАЛЫ // Труды института системного программирования РАН // Архив

Труды ИСП РАН, 2015, том 27, выпуск 2, страницы 53–64 (Mi tisp122)

Эта публикация цитируется в 2 статьях

Анализ сущностей программ на языках Си/Си++ и связей между ними для понимания программ

А. А. Белеванцев, Е. А. Велесевич

Институт системного программирования РАН

Аннотация: В статье рассматривается инструмент статического анализа программ, определяющий сущности программы на языке Си или Си++, их метрики и связи между ними. Сущностями программы являются файлы, функции, классы, методы и т.п., а связями – вызовы, наследование, чтение/запись глобальных переменных, включение, агрегация. Необходимость построения такого инструмента возникает в связи с тем, что для широкого круга задач понимания программ основой для построения решения является автоматическое извлечение необходимой информации о программе из ее исходных кодов. Инструмент должен поддерживать все конструкции языков Си и Си++ и масштабироваться для анализа реальных программных систем в миллионы строк исходного кода.
Статья посвящена методам построения такого инструмента на основе открытой компиляторной инфраструктуры LLVM[1]. Для разбора текстов программ используется промышленный компилятор Clang[2], а для последующего анализа – собственный инструмент на основе LLVM, обеспечивающий консолидацию информации обо всей программе. Так как окончательный анализ выполняется на уровне внутреннего представления (биткода) LLVM, то необходимо обеспечить сохранение в файлах с этим представлением дополнительной информации уровня исходного кода, теряющейся при изначальной трансляции. Для этого, а также для поддержки разнообразных диалектов Си и Си++, было выполнено более 400 доработок компилятора Clang[2]. В анализаторе уровня биткода центральной частью является компоновщик, задачей которого является объединение информации об одних и тех сущностях, участвующих в сборке различных компонент программной системы (например, библиотеки и приложения, ее использующего). Построенные с использованием компоновщика связи между сущностями позволяют точнее отследить отношения между компонентами всей системы. В статье также представляются результаты тестирования инструмента на коде ОС Android.

Ключевые слова: понимание программ, LLVM, статический анализ, метрики исходного кода.

DOI: 10.15514/ISPRAS-2015-27(2)-4



Реферативные базы данных:


© МИАН, 2024