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

StackOverflow https://stackoverflow.com/questions/1969916

Вопрос

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

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

Это было полезно?

Решение

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

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

Также это может заинтересовать вас: Создание библиотеки с обратной совместимой ABI, которая использует BOOST

Другие советы

ABI-COMPLAINGE-SHECKER - Инструмент для проверки обратной бинарной/совместимости источника общей библиотеки C/C ++ (DSO):

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

enter image description here

я проверяю - C Интерфейс ABI/API Checker:

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

Shlib-Compat - Проверка совместимости ABI для общих библиотек с символами:

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

Также вам может быть интересно Linux Upstream Tracker а также Linux Abi Tracker Сервисы. Они оба основаны на инструменте ABI-соответствия.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top