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

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


person RandomDSdevel    schedule 28.03.2015    source источник


Ответы (1)


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

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

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

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

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

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

person Ira Baxter    schedule 11.11.2015
comment
Спасибо за множество полезных советов! Я рассмотрю каждый из них по очереди. - person RandomDSdevel; 12.11.2015