Interesting feature, I had no idea. I just verified this with gcc and indeed the return register is always set to 0 before returning unless otherwise specified.
spoiler
intmain(void){
int foo = 10;
}
produces:
push%rbp
mov %rsp,%rbp
movl $0xa,-0x4(%rbp) # Move 10 to stack variable
mov $0x0,%eax# Return 0pop%rbp
ret
intmain(void){
int foo = 10;
return foo;
}
produces:
push%rbp
mov %rsp,%rbp
movl $0xa,-0x4(%rbp) # Move 10 to stack variable
mov -0x4(%rbp),%eax# Return foopop%rbp
ret
Should ≠ Needs to
You can do it, and it will work, but it’s unclean and not best-practice. I wouldn’t be surprised if it’s undefined behaviour.
Just to clarify. It is defined behavior - there’s plenty of undefined behavior in C but that ain’t one of them.
Interesting feature, I had no idea. I just verified this with gcc and indeed the return register is always set to 0 before returning unless otherwise specified.
spoiler
int main(void) { int foo = 10; }
produces:
push %rbp mov %rsp,%rbp movl $0xa,-0x4(%rbp) # Move 10 to stack variable mov $0x0,%eax # Return 0 pop %rbp ret
int main(void) { int foo = 10; return foo; }
produces:
push %rbp mov %rsp,%rbp movl $0xa,-0x4(%rbp) # Move 10 to stack variable mov -0x4(%rbp),%eax # Return foo pop %rbp ret