__builtin_return_address返回地址异常:为何返回地址高于main起始地址?
为什么__builtin_return_address返回的地址比main的起始地址高?
你的代码:
uintptr_t foo( void ) { return (uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0)); } int main( int argc, char **argv ) { printf("foo: %zu\nmain: %zu\n", foo(), (uintptr_t)main); return (0); }
输出结果:
foo: 94718524985719 main: 94718524985687
问题原因解析
- 你误解了
__builtin_return_address(0)的作用:它返回的不是foo函数的末尾地址,而是调用foo的那条指令的下一条指令的地址——也就是main函数里,调用foo之后要执行的代码的地址。 - main函数的起始地址
(uintptr_t)main是main第一条指令的内存位置,而调用foo的代码在main函数内部的中间位置,返回后要执行的代码在main内部更靠后的地方,所以这个地址自然比main的起始地址要高。 - 函数在内存中的指令是按执行顺序排布的,main从起始地址开始执行,调用foo的语句是main里的某一行,执行完foo后回到main继续往下走,这个返回地址属于main函数指令流的后半段,地址值大于main的起始地址完全正常。
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

