Существует ли инструмент для автоматической визуализации встроенного потока управления исходного кода проекта?

Я хотел бы иметь возможность использовать инструмент, который позволяет визуализировать поток (ы) управления программой в контексте ее исходного кода. Чтобы уточнить, такой инструмент должен в основном показывать, что происходит в программе, выпуская удобочитаемое дерево абстрактного синтаксиса в форме мультидиграфа с узлами, содержащими фрагменты единиц перевода исходного кода. Я предполагаю, что начальный узел результирующего графа будет содержать блок кода, начинающийся с точки входа в программу (которая будет main для программы на C или C++.) Новые узлы будут создаваться, когда узлу потребуется ссылаться на другой блок кода, независимо от того, находится ли он в текущем файле или в другом, а стрелки соединяют узлы. Существует ли такой инструмент или его нужно создавать с нуля?

1 ответ

Решение

У вас не будет готового инструмента, который сделает это для произвольных языков. Слишком много языков, каждый со своим синтаксисом и семантикой. Вам как-то нужен инструмент для каждого языка. Вы можете найти такие инструменты для очень часто используемых языков, например, Understand for Software.

Я думаю, что единственный способ сделать это - создать метатулы, которые позволяют относительно легко создавать инструменты для конкретного языка. Такой инструмент должен иметь общий механизм, необходимый для всех таких инструментов языковой обработки: сильные парсеры (поэтому написание грамматик для языков относительно просто), механизм построения AST, поддержка таблиц символов, подпрограммы для построения графов управления и потоков данных. Предоставляя такой механизм, можно создавать языковые интерфейсы для скромных затрат.

Есть класс инструментов, которые делают это, трансформация программы. У большинства из них есть механизмы разбора, но не остальные механизмы, которые я предложил выше.

Я считаю, что этого достаточно, чтобы потратить 20 лет своей жизни на создание таких метаинструментов. Наш инструментарий для реинжиниринга программного обеспечения DMS демонстрирует свою способность разбирать около 50+ языков, включая потрясающе сложный C++14 (как для MS, так и для GNU-вариантов). Он показывает поддержку таблицы символов и построение графов потоков управления для COBOL, Java, C, C++. (Мы не можем сделать все сразу; крутить педали настолько быстро, насколько это практически возможно). [DMS строит эти графики как структуры данных, а не "показывает" их; примеры на этой странице нарисованы с дополнительной помощью DOT].

Одним из немногих других инструментов, которые пытаются это сделать, является Clang / LLVM; это охватывает широкий спектр популярных языков. У Clang нет особой поддержки парсинга, о которой я знаю; Вы можете закодировать все это самостоятельно. Я думаю, что вы получаете контрольные графы только после преобразования языка в LLVM. Я не думаю, что у него есть какая-то особая поддержка для рисования потоковых графиков.

Более старый инструмент с хорошей репутацией для поддержки многоязычности в этом пространстве - это CoCo / R; Я не знаю много об этом. Я знаю, что он анализирует и имеет некоторую поддержку AST; Я не знаю, что он делает с анализом потока управления.