假设这个 C 代码:
int add(int a, int b){
int c = a+b;
return c;
}
int main(){
int c = add(3,4);
printf("%d", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
调用add时会发生以下情况:
Push 4 on the stack
Push 3 on the stack
Push the address of `printf` on the stack (return address)
call `add`
// do stuff under add
pop the stack and and goto `printf`
Run Code Online (Sandbox Code Playgroud)
但是下面的值 4 和 3add仍在堆栈中-0x18(%rbp)。他们不应该被清除吗?
00000000000005fa <add>:
5fa: 55 push %rbp
5fb: 48 89 e5 mov %rsp,%rbp
5fe: 89 7d ec mov %edi,-0x14(%rbp)
601: 89 75 e8 mov %esi,-0x18(%rbp)
604: 8b 55 ec mov -0x14(%rbp),%edx
607: 8b 45 e8 mov -0x18(%rbp),%eax
60a: 01 d0 add %edx,%eax
60c: 89 45 fc mov %eax,-0x4(%rbp)
60f: 8b 45 fc mov -0x4(%rbp),%eax
612: 5d pop %rbp
613: c3 retq
0000000000000614 <main>:
614: 55 push %rbp
615: 48 89 e5 mov %rsp,%rbp
618: be 04 00 00 00 mov $0x4,%esi
61d: bf 03 00 00 00 mov $0x3,%edi
622: e8 d3 ff ff ff callq 5fa <add>
627: 5d pop %rbp
628: c3 retq
Run Code Online (Sandbox Code Playgroud)
但是 add 下的值 4 和 3 仍在堆栈中
不是真的,因为堆栈不再覆盖存储4和3存储的内存。它们位于堆栈指针之外的内存中。尽管这些值仍然在内存中曾经是堆栈一部分的位置,但它们现在是未初始化垃圾的一部分。在堆栈移动后访问它们,例如通过存储它们的地址,将是未定义的行为。
他们不应该被清除吗?
不,清除这些值是不必要的,并且可能会影响程序的运行时效率。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |