Любой компилятор C с выходом C?

Мы все знаем, что компиляторы C выкладывают сборку.

Однако я занимаюсь исследованиями, в которых мой инструмент принимает только узкое подмножество ANSI C. Существуют ли какие-либо трансляторы C-to-C, которые могут встроить функции или сгладить структуры, но записать код C?

Любой другой инструмент, который может упростить код на C, позвольте мне услышать их.

5 ответов

Решение

Если вам не требуется, чтобы результирующий код C был особенно читабельным, вы можете использовать свой обычный компилятор для создания двоичного исполняемого файла, а затем использовать декомпилятор для получения кода C из двоичного кода. Скорее всего, декомпилятор не сможет "деинлайн" функции, встроенные компилятором. Хотя не уверен насчет структур, но если вы компилируете без отладочных символов и используете не слишком сложный декомпилятор, он может вообще не обнаружить структуры.

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

Старый проект MIT C2C (некоторое время находился на FTP) и более новый Cilk дают вам возможность запустить процесс C->AST->C.

Cilk и Cilk++ активно поддерживаются. Они включают в себя очень хороший синтаксический анализатор ANSI C.

Наш Den Software Reengineering Toolkit и его C-интерфейс могут это сделать.

DMS предоставляет общий механизм для синтаксического анализа, создания AST, таблиц символов, общего анализа AST и специальных анализаторов для диапазона управления / потока данных / точек / значений, а также для произвольного преобразования AST либо процедурно, либо с использованием шаблонов, а также регенерации исходного текста, включая Комментарии. Способность DMS обрабатывать несколько блоков компиляции одновременно позволяет выполнять глобальные анализаторы и преобразования, которые одновременно влияют на несколько блоков компиляции.

C-интерфейс DMS специализируется на C (у него есть интерфейсы для множества других языков). Он обрабатывает различные диалекты, в том числе ANSI, GCC 3/4, MS Visual C и Green Hills C; это может быть настроено для других диалектов по мере необходимости.

DMS использовался для различных проектов анализа / трансформации С, в том числе для анализа программной системы из 26 миллионов строк.

Интересным применением DMS является инструмент источника C для обнаружения ошибок указателя при их возникновении (вместо того, чтобы терпеть длительный сбой); посмотрите наш инструмент CheckPointer. Этот инструмент читает исходный код, вставляет дополнительный код для проверки каждого указателя доступа, а затем записывает результаты. В процессе этого он нормализует код C до упрощенного подмножества, чтобы избавиться от множества особых случаев. Эта нормализация может быть довольно близка к тому, что OP хочет сделать.

Другие вопросы по тегам