动态proto库ABI兼容性问题导致的内存分配问题

问题描述 投票:0回答:1

我在测试动态原型库的 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。

当我像往常一样运行程序时,没有问题。然而,以下是导致问题的操作:

  1. 构建程序并复制Class1库进行备份。
  2. 在*.proto文件中的MessageClass最后添加一个测试字段(其字段编号大于其他字段),然后构建程序,无需修改其他部分。
  3. 用备份库替换新的 Class1 库。
  4. 运行程序。

你希望看到什么 我认为它应该像我没有替换 Class1 库一样运行。

你看到了什么? 发生了核心转储。运行 Class1 中定义的代码时,它显示 malloc(): invalid size (unsorted)。

我们还应该了解您的项目/环境的其他信息 我在这个程序中使用bazel 6.5.0,并使用cc_shared_library和cc_import包装来构建和动态链接这些动态库。

我们使用gdb查找错误位置,发现错误可能发生在不同的位置,但一定发生在内存分配过程中。当我在 Class1 的成员函数中定义额外的长度超过 16 的 std::string 对象,或设置 MessageClass 对象的消息字段时,分配更多内存时会崩溃。不过程序足够小,不需要太多内存。

我尝试以通常的方式而不是使用proto定义一个MessageClass,并执行了上述可能导致错误的操作。程序运行正常。所以我认为这可能是动态原型库的一个特性或错误限制了内存分配。

c++ protocol-buffers
1个回答
0
投票

我认为它应该像我没有替换 Class1 库一样运行。

您的期望完全错误。向协议缓冲区消息添加字段会更改 C++ 类定义。

具有不同定义的 C++ 类不兼容 ABI。在某些非常特殊的情况下,您可以在不崩溃的情况下逃脱它,但没有任何保证,您不应该期望它能够工作。

此外,Protocol Buffers C++ 库不保证任何 ABI 稳定性:

Protobuf C++ 放弃所有跨运行时支持,并要求其生成的代码版本与其运行时版本始终精确匹配。此外,Protobuf C++ 不保证任何版本(主要、次要或微)的 ABI 稳定性。

© www.soinside.com 2019 - 2024. All rights reserved.