我最近遇到了一个问题,使用共享内存的 IPC 在两个应用程序之间出现中断。当使用相同的编译器(gcc11 或 clang14)编译时,它们可以成功通信,但使用不同的编译器时,通信会中断。
我强烈怀疑写入共享内存的对象的大小和/或偏移量根据编译器版本而不同。
有没有一种简单的方法来验证大量结构的这一点?
作为第一步,将
static_assert(sizeof(FooStruct)==16);
添加到每个结构中。选择适合您首选平台的尺寸。现在,当事情进展不顺利时,你会得到一些休息,这比没有休息好!
您必须手动编写尺寸,并将它们硬编码到文件中。
然后你会发现尺寸不匹配。这不会捕获成员上的偏移不匹配,但这种情况(老实说)很少见,因为通常偏移不匹配会导致大小差异(并非总是如此)。
完成第一步后,开始编写代码以显式序列化连线类型。让您的有线协议强制执行此类序列化,可能是通过调用基于 ADL 的函数。
您可以执行第一步,对通过网络发送的现有类型实施错误的二进制序列化,然后逐步使其不再糟糕并且更安全。