Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

abi-compliance-checker - инструмент для проверки совместимости с двоичным/исходным уровнем общей библиотеки C/С++ (DSO):

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

введите описание изображения здесь

icheck - Интерфейс C Интерфейс ABI/API checker:

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

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

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

Также вас может заинтересовать linux upstream tracker и linux abi tracker. Они оба работают от инструмента проверки соответствия abi.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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