【发布时间】:2020-03-25 15:01:39
【问题描述】:
我的理解是,如果执行 void 函数没有返回语句,那么 %rax 仍将存储从前一个非 void 函数返回的任何内容。
也就是说,如果:
int a(int param){
return param;
}
void b(){
}
int main(){
a(5);
b();
return 1;
}
那么在 main 执行完成后返回之前,%rax 中存储的值将是 5。
我的问题是,如果 b 有一个空的 return 语句会发生什么? 也就是说,
void b(){
return;
}
这会清除 %rax 吗?还是 %rax 仍然保留其先前的值?
【问题讨论】:
-
没有必要清除
%rax的无效回报,因为没有人应该看它。也不知道它以前的值是什么,因为编译后的代码可以将它用于任何事情。 -
这是一个人为的例子,当然,但我记得有一次遇到一个错误,因为 int 函数中的一个分支没有返回语句,返回的值实际上是错误的之前调用的函数。那么,为了健壮性,我们是否应该尽可能地清除 %rax 以避免这样的错误?
-
不,为了稳健性而清除该寄存器不是我们想要的。我们想要的是无法返回值的编译时错误,因此我们可以实现并修复该错误。我相信现代 C 编译器会做到这一点。
标签: assembly x86-64 calling-convention