я использую Uncrustify отформатировать каталог, полный кода C и C ++. Мне нужно убедиться, что uncrustify не изменит полученный код; Я не могу сделать diff для объектного файла или двоичных файлов, потому что объектные файлы имеют временную метку и поэтому никогда не будут идентичны. Я не могу проверить источник файлов один за другим, потому что я буду здесь годами.
Проект использует делать для процесса сборки, поэтому мне было интересно, есть ли какой-нибудь способ вывести что-то там, что можно было бы проверить.
Я искал SO и Google безрезультатно, поэтому приношу свои извинения, если это дубликат.
РЕДАКТИРОВАТЬ: я использую gcc / g ++ и компиляции для 32-битных.
Одной из возможностей было бы скомпилировать их с помощью 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. Обратите внимание, что при этом создается довольно много файлов, многие из которых довольно большие. В первый раз, когда вы сделаете это, вы, вероятно, захотите сделать это для одного исходного файла в каталоге, чтобы не утонуть в файлах, так сказать. Кроме того, не удивляйтесь, когда компиляция таким способом займет немного больше времени, чем обычно.
Других решений пока нет …