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

я использую Uncrustify отформатировать каталог, полный кода C и C ++. Мне нужно убедиться, что uncrustify не изменит полученный код; Я не могу сделать diff для объектного файла или двоичных файлов, потому что объектные файлы имеют временную метку и поэтому никогда не будут идентичны. Я не могу проверить источник файлов один за другим, потому что я буду здесь годами.

Проект использует делать для процесса сборки, поэтому мне было интересно, есть ли какой-нибудь способ вывести что-то там, что можно было бы проверить.

Я искал SO и Google безрезультатно, поэтому приношу свои извинения, если это дубликат.

РЕДАКТИРОВАТЬ: я использую gcc / g ++ и компиляции для 32-битных.

3

Решение

Одной из возможностей было бы скомпилировать их с помощью CLang и получить вывод в виде LLVM IR. Если память служит, это должны быть аргументы командной строки -S -emit-llvm,

Чтобы сделать то же самое с gcc / g ++, вы можете использовать один из его флагов для генерации файла, содержащего его промежуточное представление на некоторой стадии компиляции. На ранних стадиях все еще будут отображаться отличия от изменений в пустом пространстве и тому подобное, но быстрый тест показывает, что на стадии SSA такие неоперационные изменения исчезли из IR.

g++ -c -fdump-tree-ssa foo.cpp

В дополнение к обычному объектному файлу, он создаст файл с именем foo.cpp.018t.ssa это представляет семантические действия в вашем исходном файле.

Как отмечалось выше, я не тестировал этот обширный, хотя — возможно, что на данном этапе, немного неработающие изменения будут по-прежнему приводить к разным выходным файлам (хотя я в этом сомневаюсь). При необходимости вы можете использовать -fdump-tree-all чтобы получить вывод из все этапы компиляции1. Как простое практическое правило, я ожидал бы, что более поздние этапы будут более невосприимчивы к изменениям в форматировании и тому подобному, поэтому, если этап ssa не сработает, моим следующим выбором, вероятно, будет optimized Этап, который является одним из последних этапов (примечание: создаваемые файлы нумеруются в порядке этапа, на котором создавался каждый файл, поэтому при сбросе всех этапов становится очевидным, какие создаются на ранних этапах, а какие на более поздних этапах).



1. Обратите внимание, что при этом создается довольно много файлов, многие из которых довольно большие. В первый раз, когда вы сделаете это, вы, вероятно, захотите сделать это для одного исходного файла в каталоге, чтобы не утонуть в файлах, так сказать. Кроме того, не удивляйтесь, когда компиляция таким способом займет немного больше времени, чем обычно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]