当您从 C/C++ 调用某个函数时,如果该函数的一些参数小于 64 位,运行时是否会将这些参数所在位置的堆栈内存清零?或者每个参数的顶部是否包含垃圾?
每个参数的空间为 8 个字节(64 位),但它们可能代表 8、16 或 32 位值。
假设参数不是通过寄存器传递的,因为这个问题涉及任何参数,而不仅仅是前 4 个。
void foobar(bool a, i32 b, float c, i64 d)
{
int x = 0, y = 0, z = 0;
}
----------------------------------------
# Stack Frame #
[... Previous StackFrame ...] // <HIGH ADDRESS>
[d]
[c]
[b] // Do the top 32 most-significan-bits of param 'b' contain garbage, or zero?
[a]
[ReturnAddr]
[Saved rbp]
[x]
[y]
[z]
// read 'b' value -- if the top 32bits of 'b' contains garbage, rax has wrong value.
mov rax, qword ptr[rbp+24]