破坏带有C++接口的DSO/共享库的二进制后向兼容性并不困难。但是,是否有一种静态分析工具可以在给定早期DSO状态和当前状态(以及可能的DSO)的两个不同的头文件集时,帮助检测此类ABI中断呢?欢迎提供免费和商业产品建议。
如果它还能警告关于不良实践的问题,例如在DSO接口中的内联函数和默认函数参数,那就太好了。
破坏带有C++接口的DSO/共享库的二进制后向兼容性并不困难。但是,是否有一种静态分析工具可以在给定早期DSO状态和当前状态(以及可能的DSO)的两个不同的头文件集时,帮助检测此类ABI中断呢?欢迎提供免费和商业产品建议。
如果它还能警告关于不良实践的问题,例如在DSO接口中的内联函数和默认函数参数,那就太好了。
abi-compliance-checker - 一款用于检查共享 C/C++ 库(DSO)的向后二进制/源代码级别兼容性的工具:
这是一款检查 C/C++ 库向后二进制和源码级别兼容性的工具。该工具会检查旧版本和新版本的头文件和共享库,并分析 API 和 ABI(ABI=API+编译器 ABI)的更改,这些更改可能会破坏二进制和/或源码的兼容性:调用堆栈的更改、v-table 的更改、删除符号、重命名字段等。
icheck - C 接口 ABI/API 检查工具:
这是一款用于静态检查 C 接口的 API 和 ABI 更改的工具。它可以检测到可能导致 ABI 更改的所有类型声明更改,以及大多数 API 更改。 icheck 旨在与库一起使用,作为防止 ABI 漂移的方法。
shlib-compat - 具有符号版本控制的共享库 ABI 兼容性检查工具:
shlib-compat 使用 DWARF 调试符号来重建和比较导出符号的定义,包括函数参数和结构类型。
此外,您可能会对 linux upstream tracker 和 linux abi tracker 服务感兴趣。它们都是由 abi-compliance-checker 工具提供支持。
我假设您熟悉这篇教程:C++二进制兼容性问题,如果不熟悉,请阅读它!
我听说过这个工具:ABI兼容性检查器,但从未测试或使用过,因此没有意见。
另外这可能会对您有所帮助:创建使用Boost库的向后兼容ABI库
这两个工具都不会报告typedef定义的更改,因为它在另一个头文件中。但是假设人们会比较涉及的所有头文件。如果您不想手动执行此操作,则使用的任何工具必须包含基本上完整的C++解析器、名称解析器,并且必须比较等效的声明。另一位发帖者建议几乎就是这个答案:比较GCCXML输出以确定等效性。我不确定实际操作起来有多容易;它不能仅仅是“文件的XML顺序相同吗?”。
ABI - 应用程序二进制接口是指编译器将源代码转换为机器可识别指令的方式。同一行源代码可以被翻译成不同的字节流,在最终的程序中。
在源代码上运行的静态分析器无法预测编译器将如何翻译它。这个决定是在编译器编码或设置中做出的。因此,我认为在这种情况下,静态分析器对你没有帮助。