Rob*_*Rob 2 c++ assembly sizeof
我有一个类,C.C有一个成员变量声明为:bool markerStart;
从C内部调用sizeof(*this)给出的值为0x216字节.
在C的其他地方,我做:markerStart = false;
而不是将markerStart设置为false,这个调用实际上是在内存中破坏下一个类的开始!
看一下反汇编的代码,我发现:
markerStart = false;
06FB6B7F mov eax, dword ptr [this]
06FB6B78 mov byte ptr [eax+218h], 0
Run Code Online (Sandbox Code Playgroud)
第二个移动指令是将此+ 0x218处的字节设置为零,但由于该类仅为0x216字节长,因此这会破坏内存!
在回复评论时,肯定是markerStart = false指令.我可以在反汇编视图和内存视图中观察它(并使用Windbg,使用数据断点).下一个类的第一个字节被设置为零,这会弄乱它的vftbl指针.
注意:获取markerStart的地址并从中减去它,产生0x211!
任何人都可以给我一个线索,从哪里开始寻求解决这个问题?
更新:感谢您的帮助.没有代码,你几乎不可能解决问题.我正在寻找的是关于从哪里开始寻找的提示.大多数人提供了很好的提示,谢谢!
我终于找到了问题.在这种情况下,已在一个类中设置了对齐,并且在关键代码块之后未正确重置.具有错误对齐的类恰好在C类声明之前被编译 - 因此这就是问题出现的地方.
您需要发布更多代码 - 如果您可以将其修剪到异常发生的最小类定义,那就更好了.这本身可能会帮助您确定正在发生的事情.
我遇到的一些可能性:
没有更多信息,我会去寻找ODR.这些可能是阴险的,在编译或链接时无法检测到.
正如Pontus所指出的那样,你可能会以某种方式打破一个定义规则.您可能在两个翻译单元中包含了带有C类定义的头文件,其中其他代码(通常在前面的头文件中)更改了C类定义的解释方式,因此它在两个翻译中具有不同的大小单位.
一种可能性是,您意外地更改了默认成员对齐(通过编译器的命令行参数或通过源中的#pragma),以便两个不同的转换单元认为结构具有不同的大小,因为数量不同padding(大多数x86编译器默认为4字节边界上的对齐,但允许您根据需要请求1字节边界上的对齐).在其他头文件中查找#pragma,更改缺少以下#prama的默认对齐,将其恢复为之前的值(您没有指定编译器,因此我无法给出具体信息).