C 为什么会发生字节溢出,它们实现了什么?

C 为什么会发生字节溢出,它们实现了什么?,c,memory,assembly,x86,llvm,C,Memory,Assembly,X86,Llvm,什么是字节溢出 当我从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 sam

什么是字节溢出

当我从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
...

寄存器溢出就是当局部变量比寄存器多时发生的情况(这是一个类比——真正的意思是它们必须保存到内存中)。该指令正在保存EAX的值,可能是因为EAX被malloc阻塞,并且您没有另一个备用寄存器来保存它(无论出于何种原因,编译器决定以后需要在寄存器中使用常量60)

从外观上看,编译器肯定可以省略
mov-DWORD-PTR[ESP+60]、EAX
,而在不使用
mov-EAX、DWORD-PTR[ESP+60]
的地方重复
mov-EAX、60
,或者使用的任何偏移量,因为此时保存的EAX值不能超过60。然而,编译并不能保证是完全最优的

还要记住,在
子ESP,84
之后,堆栈大小不会调整(除了通过调用指令,该指令当然会推送返回地址)。以下说明将ESP用作内存偏移量,而不是目标