Построение универсального представления графа потока управления для статического анализа исходного кода ЧелГУ Зубов М.В, Пустыгин А.Н., Старцев Е.В. Статический анализ - способ анализа программного продукта по его тексту до запуска его исполняемого кода. Используется статический анализ исходного текста, поэтому программные инструменты инструменты пригодны для анализа ПО с открытым исходным текстом Промежуточное представление исходного текста - это текстовый набор данных, над которым выполняется анализ. ПП получается из исходного кода с целью сокращения затрат ресурсов при последующей обработке, в первую очередь трудозатрат на разработку инструментов Наиболее технологичный путь получения ПП из AST, внутреннего набор данных компилятора (тогда AST — не промежуточное представление по определению) Получение промежуточного представления из исходного текста Универсальные многоуровневые представления в анализе исходного текста - промежуточные представления, описывающие родственные синтаксические конструкции разных языков наиболее близким, то есть общим способом. Строятся из представлений предыдущего уровня путем сохранения только необходимые для конкретного анализа данных Предназначены для упрощения конкретного анализа «прореживанием» предыдущего ПП Универсальный (единый) формат позволяет использовать единый программный инструмент для исходных текстов на разных языках. Универсальные многоуровневые представления Универсальное классовое представление (UCR) для Python и Java предназначено для построения и анализа диаграммы классов по исходному тексту проекта на одном из этих языков или проектов на обоих языках одновременно Позволяет применять унифицированный инструмент анализа диаграммы классов для исходного текста Python и Java Граф потока управления (CFG) ориентированный граф, описывающий множество путей исполнения текста, предназначенный для определения трасс достижимости на этапе статического анализа и решения связанных задач (определение порядка вызовов, построения срезов по заданным атрибутам и пр.) В данной работе применяется для анализа исходного текста Ограничения принятой модели CFG ● ● ● ● ● Граф строится только для функции или метода, с возможностью связывания отдельных частей друг с другом Вызовы из метода пока не учитываются Участки последовательного кода без ветвления представляются одним узлом Представление - ориентированный граф, предназначенный для анализа известными методами Текстовая форма основана на открытом формате GraphML (graphml.graphdrawing.org), позволяющем описывать в XML графы любого вида Пример кода Java для иллюстрации формата СFG A: B: C: D: public void foo() { this.count++; if (this.enough){ bar(); } else { fooBar(); } } Граф потока управления для примера кода Представление примера в виде дерева Представление примера в виде текста XML Визуализация CFG ● ● Используется формат dot из пакета graphviz (www.graphviz.org) На каждый метод создается отдельное изображение Пример исходного кода для визуализации (Python) def set_color_formatter(logger=None, **kw): if logger is None: logger = logging.getLogger() if not logger.handlers: logging.basicConfig() format_msg = logger.handlers[0].formatter._fmt fmt = ColorFormatter(format_msg, **kw) fmt.colorfilters.append(xxx_cyan) logger.handlers[0].setFormatter(fmt) Из класса logilab.common.logging_ext.ColorFormatter, Logilab-Common Визуализация CFG примера кода утилитой dot Пути анализа CFG ● ● ● ● Интерактивный визуализатор CFG с взаимной навигацией по коду и классам построение срезов (слайсинг) для сокращения количества данных в представлении путем Построение диаграммы последовательности в стиле UML Поиск трасс между двумя указанными функциями Прототип интерактивного визуализатора CFG Совместное использование промежуточных представлений. Анализ объединения представлений Механизм совместного анализа CFG и UCR В CFG указывается id класса из UCR, к которому принадлежит метод ● метод идентифицируется по сигнатуре Функции python, не принадлежащие классам, в анализе не участвуют ● Общие id проставляются в текстовом XMLфайлах CFG и UCR Представление связей в схемах XML https://github.com/exbluesbreaker/csu-code-analysis/blob/master/data/cfg.xsd https://github.com/exbluesbreaker/csu-code-analysis/blob/master/data/classes.xsd Совместное использование промежуточных представлений для слайсинга ● ● Метод уменьшения количества данных в представлении при решении частной задачи анализа Результат слайсинга остается валидным представлением (не изменяется формат данных) Задача построения срезов для UCR и CFG по отдельности Слайсинг на основе нескольких представлений Слайсинг на основе нескольких представлений ● ● Слайсинг одного из промежуточных представлений исходного кода с использованием других промежуточных представлений этого же кода Например, при слайсинге CFG с использованием UCR может быть использована информация о принадлежности методов из CFG классам из UCR Построенные для имеющихся промежуточных представлений срезы ● Слайсинг UCR: – ● ● Слайсинги CFG: – Вызываемые методы для заданного метода – Вызывающие методы для заданного метода Слайсинги UCR с использованием CFG – ● Дерево наследования для заданного класса Классы, экземпляры которых создаются в методах заданного класса Слайсинги CFG с использованием UCR – Методы или функции, создающие экземпляр заданного класса Пример слайсинга UCR с использованием CFG (исходный текст python, библиотека logilab.astng) ● ● ● Выполняется слайсинг для класса FromMixinImport из модуля logilab.astng.mixins. В результате остается интересующий класс и классы, экземпляры которых создаются в его методах. 2 варианта представления результатов: – Указываются связанные классы-родители из диаграммы классов, – Указываются только интересующие классы (более строгий слайсинг) UCR logilab до выполнения слайсинга Исходный код класса для примера Результат слайсинга (с наследованием) Результат слайсинга (без наследования) Спасибо за внимание! https://github.com/exbluesbreaker/csu-code-analysis