问题 为什么会发生字节溢出以及它们实现了什么?


什么是字节溢出?

当我从C程序生成的LLVM中间表示转储x86 ASM时,会有大量溢出,通常为4字节大小。我无法弄清楚它们为什么会发生以及它们取得了什么。

他们似乎“切断”了堆叠的部分,但是以一种不寻常的方式:

## this fragment comes from a C program right before a malloc() call to a struct.
## there are other spills in different circumstances in this same program, so it
## is not related exclusively to malloc()
...
sub ESP, 84
mov EAX, 60
mov DWORD PTR [ESP + 80], 0
mov DWORD PTR [ESP], 60
mov DWORD PTR [ESP + 60], EAX # 4-byte Spill
call malloc
mov ECX, 60
...

12737
2018-05-09 02:20


起源



答案:


寄存器溢出就是当你有更多的局部变量而不是寄存器时会发生什么(这是一个类比 - 实际上意思是它们必须保存到存储器中)。该指令正在保存EAX的值,可能是因为EAX被malloc破坏了,并且你没有另外的备用寄存器来保存它(并且无论出于何种原因,编译器已经决定它以后需要在寄存器中使用常量60)。

从它的外观来看,编译器当然可以省略 mov DWORD PTR [ESP + 60], EAX 而是重复了 mov EAX, 60 否则它会在哪里 mov EAX, DWORD PTR [ESP + 60] 或者它使用的任何偏移,因为EAX的保存值在那时不能超过60。但是,编译并不能保证是完美的最佳选择。

熊也要记住之后 sub ESP, 84,堆栈大小不调整(除了当然按下返回地址的调用指令)。以下说明使用ESP作为内存偏移,而不是目标。


12
2018-05-09 03:02