在GCC cdecl
调用约定中,在调用返回后,我可以依赖我推入堆栈的参数是否相同?即使混合ASM和C并启用优化(-O2
)?
答案 0 :(得分:5)
总之:不。
考虑以下代码:
__cdecl int foo(int a, int b)
{
a = 5;
b = 6;
return a + b;
}
int main()
{
return foo(1, 2);
}
这产生了这个asm输出(用-O0编译):
movl $5, 8(%ebp)
movl $6, 12(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
popl %ebp
ret
因此,__cdecl函数很可能会踩踏堆栈值。
这甚至没有计算内联或其他优化魔法的可能性,因为事情最初可能不会在堆栈中结束。