gpt4 book ai didi

c - 为什么会发生字节溢出以及它们的作用是什么?

转载 作者:IT王子 更新时间:2023-10-28 23:31:44 26 4
gpt4 key购买 nike

什么是字节溢出?

当我从 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, 60否则 mov EAX, DWORD PTR [ESP + 60] 或它使用的任何偏移量,因为此时 EAX 的保存值不能超过 60。但是,编译并不能保证完美。

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

关于c - 为什么会发生字节溢出以及它们的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com