Создание программы-генератора CFG-графа из исходной программы на C++

12 000 руб. за проект
31 октября 2020, 16:53 • 5 откликов • 41 просмотр
Задача, которую предлагается решить, состоит в создании на любом ООП языке программы, выполняющей генерацию CFG (графа потока управления) произвольной программы на С++ (в файле с расширением cpp) на основе её исходника. Результирующая программа должна выполнять следующие операции:

- формировать AST (абстрактное синтаксическое дерево) полученной на вход программы с использованием оригинального (самостоятельно написанного исполнителем) алгоритма либо готового парсера на любом предпочтительном для исполнителя языке;
- выполнять обход AST для сбора информации о блоках, перечисленных ниже;
- выводить результаты обхода в файл dot
- строить граф (в файле с расширением png или jpg) из содержимого dot-файла с использованием инструмента graphviz или с помощью другой технологии, известной исполнителю и позволяющей сформировать CFG в виде файла в любом из вышеуказанных форматов.

В процессе обхода требуется собрать информацию, связанную с инструкциями:
- if/else
- switch/case
- for
- while
- break
- continue

Релевантные данные:
- наименование инструкции (if, else, while, return и т.д.)
- условие, при котором данная инструкция будет выполнена в потоке управления программы (например, для if: x > 0, для for: i < 10 и т.д.)

На итоговом графе:
- должны быть указаны точки входа (начала потока) и завершения (выхода из программы при нормальном окончании процесса), т.е. требуется обеспечить присутствие двух узлов-терминалов;
- требуется отобразить все функции, вызываемые в ходе выполнения программы, а не отдельно взятую;
- должны отображаться блоки, относящиеся ко всем вышеперечисленным инструкциям, а не к отдельно взятым.

В целевом варианте файл с исходным кодом на С++ передаётся на вход исполняемой программы (соответствующей вышеизложенным условиям), после чего формируется граф, представляющий собой изображение в файле с расширением png или jpg.

Итоговая программа должна обеспечивать создание графа для представленной программы таким образом, чтобы на нём оказались отображены все вышеуказанные инструкции (в процессе выполнения предоставленного кода каждая из них выполняется как минимум один раз).

Проверка результата предполагает передачу файла (либо нескольких файлов) с исходным кодом в формате cpp для запуска и тестирования. Итоговая программа должна подвергаться компиляции с использованием g++. При необходимости разъяснения технических аспектов компиляции/запуска программы исполнителем предоставляется инструкция c алгоритмом выполнения операций.

Задание определяется выполненным в случае предоставления исполнителем исходного кода и инструкций (опционально), позволяющих произвести компиляцию и запуск программы с получением вышеописанного результата.