Найти функциональные изменения между двумя ревизиями файла (compile diff?) - PullRequest
1 голос
/ 16 января 2012

Я ищу инструмент, который проверяет, генерируют ли два (C) файла исходного кода один и тот же двоичный файл, чтобы я мог находить реальные функциональные изменения между двумя файлами и игнорировать простые изменения стиля кодирования. Было бы замечательно, если бы это работало даже внутри файла для разных наборов изменений, поэтому файл мог измениться в стиле кодирования в некоторых местах, но также был добавлен один функциональный патч.

Ответы [ 5 ]

1 голос
/ 16 января 2012

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

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

1 голос
/ 16 января 2012

Очень очень сложно написать программу, чтобы выяснить «функциональный» результат другой программы. Такая программа звучит так, как будто это необходимо Я предполагаю, что сами компьютерные программы правы в отношении самого компактного и машиночитаемого способа, которым мы должны даже описывать функциональность, поэтому довольно сложно написать программу, которая анализирует программу и генерирует «лучшее» описание.

Каким-то образом абстрагирование и «понимание» того, что различия в стиле кодирования не влияют на функциональность, также звучит очень и очень сложно. Мне сложно как-то вручную читать чужой код, потому что различия в стиле могут быть довольно большими, хотя конечный результат может быть одинаковым в «моем стиле».

Я был бы удивлен, если бы решение не требовало решения проблемы остановки , что в общем случае оказалось невозможным.

0 голосов
/ 16 января 2012

Существует отрасль информатики, которая занимается параллелизмом и параллельными процессами.Одним из применений является решение, являются ли две системы поведенчески эквивалентными (в некотором отношении бисимуляция (слабое или сильное)).

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

0 голосов
/ 16 января 2012

Если все, что вас интересует, это то, что они "генерируют один и тот же двоичный файл", тогда самое простое решение - просто сгенерировать оба двоичных файла и сравнить.

Обратите внимание, однако, что есть вещи, которые приводят к двоичным разным битам, даже если они функционально идентичны:

  • Изменение имен внешних функций
  • Оптимизация
  • Изменение порядка фрагментов независимого кода
  • и т.д.
0 голосов
/ 16 января 2012
  • Отображение двоичного кода обратно в источник с «функциональностью высокого уровня» - маловероятно.

  • Сравнение двух исходных файлов по «функциональности высокого уровня» (без учета стиля кодирования) - возможно:

    http://cscope.sourceforge.net/

  • Альтернативное предложение:

    Напишите инструмент, который «нормализует» ваши исходные файлы - применяя одинаковое форматирование к обоим наборам кода.

    Это может быть легко автоматизировано.

    Например:

    1) извлечение из системы контроля версий,

    2) применить «стандартный формат»,

    3) сравнить

...