Инструмент сравнения с C-файлом?

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

Требования:

  • Работает в Linux

Желательно:

  • Бесплатно
  • бесплатно
  • Имеет интерактивный графический интерфейс (например, meld, kdiff3 и т. д.)
  • подключается к инструментам, связанным с разницей
Кажется, вы имеете в виду «имя функции» и хотите, чтобы он сравнивал только функции с одинаковым именем?
@IraBaxter: Да, верно.
Нет ответов в течение 60 дней. Заинтересованы в инструменте, который сравнивает исходный файл по языковым структурам (а не по текстовым строкам) [который конкретно не соответствует функциям]?
@IraBaxter: Конечно, это достаточно близко, чтобы быть интересным.

Ответы (1)

Вы можете рассмотреть семейство умных дифференциаторов Semantic Designs (моя компания).

Smart Differencer анализирует исходный текст для двух сравниваемых файлов, используя точный анализатор языка (и даже диалекта, например, VisualStudio 2010), строит дерево, а затем находит редактирование дерева с минимальным расстоянием, чтобы объяснить, чем они отличаются с точки зрения грамматика. Это означает отчет о дельтах, таких как «измененное выражение», «перемещенный оператор», «переименованная переменная», с использованием точной информации о строке и столбце. Поскольку он использует синтаксический анализатор, он игнорирует изменения в пробелах (хотя вы можете попросить его рассматривать комментарии как не пробелы в качестве опции).

Он изначально работает под Windows, без проблем работает в Linux под Wine с использованием предоставленных скриптов sh. Это коммерческое. Вывод похож на сравнение, потому что это инструмент сравнения, а не графический интерфейс.

Smart Differer работает со многими языками. Для версии C возникают некоторые трудности при анализе исходного кода C с неловко размещенными макросами и/или условиями препроцессора; обратите внимание, что он пытается анализировать исходные файлы без контекста полной единицы компиляции, которую вы обычно передаете компилятору. Файлы системных заголовков, как правило, здесь довольно плохи, но редко кто-то хочет их сравнивать. Вы можете улучшить их, предоставив ему некоторые подсказки о вещах, которые являются макросами; если вы хотите немного изменить свой исходный код, один раз, переместив неудобные условные операторы, вы можете в значительной степени решить эту проблему.

Не совсем то, что хочет OP, но суть этого, кажется, совпадает.

... и можно ли ограничить возможные операции? например, «не перемещать операторы в функции или из них»?
Умные Дифференцеры знают о грамматике, но не знают о границах функций. Это своего рода интересный запрос функции :-}