Я понимаю, что это предложение немного касательно, но оно может помочь уточнить и оценить требования.Это будет работать для C или C ++ ...
Вместо того, чтобы пытаться найти текстовые блоки, которые являются функциями, и сравнивать их, используйте компилятор для создания двоичных блоков.В частности, для каждого исходного файла C / C ++ в наборе изменений скомпилируйте его в объект.Затем используйте объектный код в качестве основы для сравнений.
Это может быть неосуществимо для вас, но в IIRC есть опция компиляции на gcc, чтобы каждая функция компилировалась в «независимый фрагмент» внутри сгенерированногофайл объектного кода.Компоновщик может вытянуть каждый «кусок» в программу.(Становится здесь довольно поздно, поэтому я посмотрю это утром, если вам интересна идея.)
Итак, если мы сможем это сделать, у вас будет много функций, определенныхкуски двоичного кода, поэтому простое «тепловое» сравнение состоит в том, «насколько длиннее или короче код между версиями для любой функции?»
Я также думаю, что было бы целесообразно использовать objdump для восстановления ассемблерадля функций.Я мог бы использовать некоторые регулярные выражения на этом этапе, чтобы обрезать имена регистров, чтобы изменения в распределении регистров не вызывали слишком много ложных срабатываний (изменений).
Я мог бы даже попытаться отсортировать инструкции на ассемблере в телах функций и различить их, чтобы получить образец «удалено» против «добавлено» между двумя реализациями функций.Это дало бы меру изменений, которая в значительной степени не зависит от макета и даже несколько не зависит от порядка некоторых источников.
Так что может быть интересно посмотреть, являются ли две альтернативные реализации одной и той же функции (т.е. из разных наборов изменений) одинаковыми инструкциями: -)
Этот подход также должен работать для C ++, потому чтовсе имена были соответствующим образом искажены, что должно гарантировать сравнение одних и тех же функций.
Таким образом, регулярные выражения могут быть очень простыми: -)
Предполагая, что все это просто, чтоможет ли этот подход не дать вам?
Примечание: эта базовая стратегия может работать для любого языка, предназначенного для машинного кода, а также для наборов инструкций VM, таких как байт-код Java VM, код .NET CLR и т. д.