我在测试动态原型库的 ABI 兼容性时遇到了内存分配的问题。 您使用什么版本的 protobuf 以及什么语言? 版本:v3.19.6 语言:C++
什么操作系统(Linux、Windows...)和版本? Linux Ubuntu 20.04.6
您使用什么运行时/编译器(例如,python 版本或 gcc 版本) 海湾合作委员会 9.4.0
你做了什么? 我编写了一个程序来测试proto动态库的ABI兼容性。 该程序由MessageClass(由proto定义)、Class1、Class2、一些通信类和入口main构成。在此程序中,我使用 Class1 对象来创建 MessageClass 对象并转换为 Class2 对象。 MessageClass由两个字段组成,version和message,这两个字段都是字符串类型。 我为Class1、Class2和MessageClass制作了三个动态库。 Class1 和 Class2 取决于 MessageClass。
当我像往常一样运行程序时,没有问题。然而,以下是导致问题的操作:
你希望看到什么 我认为它应该像我没有替换 Class1 库一样运行。
你看到了什么? 发生了核心转储。运行 Class1 中定义的代码时,它显示 malloc(): invalid size (unsorted)。
我们还应该了解您的项目/环境的其他信息 我在这个程序中使用bazel 6.5.0,并使用cc_shared_library和cc_import包装来构建和动态链接这些动态库。
我们使用gdb查找错误位置,发现错误可能发生在不同的位置,但一定发生在内存分配过程中。当我在 Class1 的成员函数中定义额外的长度超过 16 的 std::string 对象,或设置 MessageClass 对象的消息字段时,分配更多内存时会崩溃。不过程序足够小,不需要太多内存。
我尝试以通常的方式而不是使用proto定义一个MessageClass,并执行了上述可能导致错误的操作。程序运行正常。所以我认为这可能是动态原型库的一个特性或错误限制了内存分配。
我认为它应该像我没有替换 Class1 库一样运行。
您的期望完全错误。向协议缓冲区消息添加字段会更改 C++ 类定义。
具有不同定义的 C++ 类不兼容 ABI。在某些非常特殊的情况下,您可以在不崩溃的情况下逃脱它,但没有任何保证,您不应该期望它能够工作。
此外,Protocol Buffers C++ 库不保证任何 ABI 稳定性:
Protobuf C++ 放弃所有跨运行时支持,并要求其生成的代码版本与其运行时版本始终精确匹配。此外,Protobuf C++ 不保证任何版本(主要、次要或微)的 ABI 稳定性。