Измените дерево AST в C и скомпилируйте новое дерево AST - PullRequest
1 голос
/ 13 апреля 2020

Что я хочу сделать, это 1. Разобрать C код для генерации AST 2. Изменить AST 3. Скомпилировать новый AST без изменения. c исходного файла.

Есть ли какой-нибудь инструмент Я могу использовать для этого? Если нет, есть ли какой-нибудь инструмент, который я могу использовать для изменения кода сборки?

Я смотрел на g cc -plugin, документации на него очень мало, я могу только выяснить, как печатать информацию когда g cc анализирует исходный код (например, типы переменных), но я не знаю, как я могу их изменить.

1 Ответ

0 голосов
/ 13 апреля 2020

Наш набор инструментов для реинжиниринга программного обеспечения DMS с его C интерфейсом предназначен для этого.

DMS обеспечивает возможность общего анализа и преобразования. C Front End построен поверх DMS, знает много диалектов C, может анализировать их в AST, включая сохранение во многих случаях условного препроцессора.

Затем используется возможность перезаписи DMS для внесения изменений в AST. Вместо того, чтобы непосредственно взламывать узлы дерева, обычно концептуально пишется правило в форме:

if (sourceCodePattern) and condition then replacementCodepattern

, где sourceCodePattern и replaceCodePattern - это фрагменты кода C с переменными заполнителями. Пример:

 rule make_autoinc(l: lefthandside, e:expression):statement->statement
     " \l = \l + \e ; " ->  " \l++; ";

После того, как все ваши правила переписывания были применены, DMS может затем распечатать измененный исходный код обратно в файл, сохранив отступы, радикальные числа, комментарии и т. Д. c как совершенно корректные, компилируемые исходный код.

То, что вы делаете с ним после этого, является вашим бизнесом.

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

...