什么是字节泄漏?
当我从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
...
答案 0 :(得分:13)
寄存器溢出就是当你有更多的局部变量而不是寄存器时会发生什么(这是一个类比 - 实际上意味着它们必须保存到内存中)。该指令正在保存EAX的值,可能是因为EAX被malloc破坏了,并且你没有另外的备用寄存器来保存它(并且无论出于什么原因,编译器已经决定它以后需要在寄存器中使用常量60)。 / p>
从它的外观来看,编译器当然可以省略mov DWORD PTR [ESP + 60], EAX
而是重复mov EAX, 60
否则mov EAX, DWORD PTR [ESP + 60]
或其使用的任何偏移,因为EAX的保存值当时不能超过60岁。但是,编译并不能保证是最佳的。
请记住,在sub ESP, 84
之后,不调整堆栈大小(除了调用指令当然会推送返回地址)。以下说明使用ESP作为内存偏移,而不是目标。