有没有办法检查 gcc 和 clang 之间结构的大小或结构成员的偏移量是否不同?

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

我最近遇到了一个问题,使用共享内存的 IPC 在两个应用程序之间出现中断。当使用相同的编译器(gcc11 或 clang14)编译时,它们可以成功通信,但使用不同的编译器时,通信会中断。

我强烈怀疑写入共享内存的对象的大小和/或偏移量根据编译器版本而不同。

有没有一种简单的方法来验证大量结构的这一点?

c++ gcc clang offset
1个回答
0
投票

作为第一步,将

static_assert(sizeof(FooStruct)==16);
添加到每个结构中。选择适合您首选平台的尺寸。现在,当事情进展不顺利时,你会得到一些休息,这比没有休息好!

您必须手动编写尺寸,并将它们硬编码到文件中。

然后你会发现尺寸不匹配。这不会捕获成员上的偏移不匹配,但这种情况(老实说)很少见,因为通常偏移不匹配会导致大小差异(并非总是如此)。

完成第一步后,开始编写代码以显式序列化连线类型。让您的有线协议强制执行此类序列化,可能是通过调用基于 ADL 的函数。

您可以执行第一步,对通过网络发送的现有类型实施错误的二进制序列化,然后逐步使其不再糟糕并且更安全。

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