Инструмент статического анализа для обнаружения разрывов ABI в C++

Нетрудно сломать двоичную обратную совместимость DSO/ разделяемой библиотеки с интерфейсом C++. Тем не менее, существует ли инструмент статического анализа, который может помочь обнаружить такие разрывы ABI, если ему даны два разных набора заголовочных файлов: файлы более раннего состояния DSO и файлы текущего состояния (и, возможно, также DSO)? Приветствуются как бесплатные, так и коммерческие предложения.

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

6 ответов

Решение

Я предполагаю, что вы знакомы с этим учебником: проблемы двоичной совместимости с C++, если не читаете его!

Я слышал об этом инструменте: http://ispras.linuxbase.org/index.php/ABI_compliance_checker, однако никогда не тестировал и не использовал его, поэтому не имеет никакого мнения.

Также это может вас заинтересовать: Создание библиотеки с обратно совместимым ABI, использующим Boost

https://github.com/lvc/abi-compliance-checker - инструмент для проверки обратной двоичной совместимости / совместимости на уровне исходного кода совместно используемой библиотеки C/C++ (DSO):

Инструмент для проверки обратной двоичной и исходной совместимости библиотеки C/C++. Инструмент проверяет заголовочные файлы и разделяемые библиотеки старых и новых версий и анализирует изменения в API и ABI (ABI=API+ ABI компилятора), которые могут нарушить совместимость двоичного кода и / или источника: изменения в стеке вызовов, изменения v-таблицы, удаленные символы, переименованные поля и т. д.

icheck - Интерфейс ABI / API для проверки интерфейса:

Инструмент для статической проверки C-интерфейсов на предмет изменений API и ABI. Все изменения в объявлениях типов, которые могут вызвать изменения ABI, должны быть обнаружены вместе с большинством изменений API. icheck предназначен для использования с библиотеками, как метод предотвращения дрейфа ABI.

shlib-compat - средство проверки совместимости ABI для разделяемых библиотек с версионированием символов:

shlib-compat использует символы отладки карликов для воссоздания и сравнения определений экспортируемых символов, включая аргументы функций и структурные типы.

Также вас могут заинтересовать службы отслеживания исходных данных linux и abux. Они оба работают на инструменте проверки соответствия abi.

Я помню, на работе они использовали GCC XML для тестирования двоичной совместимости. По сути, он генерирует XML-представление дерева объектов компилятора. Теория гласит, что если xml эквивалентен, то они поддерживают двоичную совместимость.

Наш инструмент C++ Smart Differencer сравнивает два исходных файла и сообщает о различиях с точки зрения языковых структур (идентификаторы, выражения, операторы,...) и возможных правок редактирования (вставка, удаление, перемещение, копирование, замена-идентификатор, ...).

Он не отвечает на вопрос ABI напрямую, но информация, которую он предоставляет, может быть довольно полезной. Пример, обсуждаемый в другом ответе, - это изменение типа возвращаемого значения с struct {a,b} на struct {b, a}. SmartDifferencer сообщит, что был перемещен. (Примечание. Обычный инструмент сравнения сообщает, что строка, содержащая определение структуры, была изменена, поэтому вы получаете ту же информацию, но SmartDifference будет игнорировать изменения в пробелах / компоновке и комментариях, что приведет к уменьшению концептуального шума).

Ни один из этих инструментов не сообщит об изменении определения typedef, оно находится в другом заголовочном файле. Но тогда, вероятно, можно было бы сравнить все файлы заголовков. Если вы не хотите делать это вручную, любой используемый инструмент должен включать в себя полный синтаксический анализатор C++, распознаватель имен и сравнивать объявления на эквивалентность. Другой автор предложил такой ответ: сравнение выходных данных GCCXML на эквивалентность. Я не уверен, насколько это легко на практике; это не может быть просто "файлы в порядке XML?".

Единственный безопасный способ сделать это - экспортировать вашу библиотеку, используя интерфейс C. Библиотека C++ совместима только с тем компилятором, который вы используете для его компиляции.

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

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

Другие вопросы по тегам