最近,我在一个相对较大的项目中发现,丑陋的运行时崩溃是因为在不同的cpp文件中以不同的顺序包含了各种 header 。

这些 header 包含#pragma pack-有时未“关闭”这些pragma(我是说,将其设置回编译器默认的#pragma pack())-导致不同对象文件中的对象布局不同。难怪当应用程序访问在一个模块中创建并传递到另一个模块的结构成员时崩溃。或派生类从基类访问成员。

由于我喜欢从发现的每个错误中创建更通用的调试和断言策略的想法,因此我真的想断言对象布局始终且在各处都是相同的。

所以很容易断言

ASSERT(offsetof(membervar)== 4)

但这不会在另一个模块中捕获不同的布局-或每当结构布局更改时都需要手动更新..所以我最喜欢的主意是

ASSERT(offsetof(membervar)== offsetof(othermodule_membervar))

一个断言有可能吗?还是单元测试的情况?

谢谢,
H

最佳答案



我看不到在技术上使之成为可能的方法。此外,即使在物理上可行,这也不实用。对于每对源文件,您都需要一个断言:

ASSERT( offsetof(A.c::MyClass.membervar) == offsetof(B.c::MyClass.membervar) )
ASSERT( offsetof(A.c::MyClass.membervar) == offsetof(C.c::MyClass.membervar) )
ASSERT( offsetof(A.c::MyClass.membervar) == offsetof(D.c::MyClass.membervar) )
ASSERT( offsetof(B.c::MyClass.membervar) == offsetof(C.c::MyClass.membervar) )
ASSERT( offsetof(B.c::MyClass.membervar) == offsetof(D.c::MyClass.membervar) )

等等

10-06 07:24