__builtin_return_address介绍
·
__builtin_return_address介绍
__builtin_return_address 是 GCC(以及兼容 GCC 的编译器,如 Clang)提供的一种内建函数(built-in function),用于在运行时获取当前函数的返回地址(return address),常用于调试、日志、堆栈展开或安全审计等场景。
函数原型
void * __builtin_return_address(unsigned int level);
参数 level:表示调用栈的层级。
-
level = 0:当前函数的直接调用者的返回地址(即当前函数执行完后将要返回到的地址)。
-
level = 1:调用者的调用者的返回地址(上上层)。
以此类推。
返回值:对应层级的返回地址(类型为 void*),若无法获取则可能返回 0 或无效地址。
基本用法示例
#include <stdio.h>
void print_caller(void) {
void *ra = __builtin_return_address(0);
printf("Caller return address: %p\n", ra);
}
void foo(void) {
print_caller(); // 打印 foo 的返回地址(即 main 中调用 foo 的下一条指令地址)
}
int main(void) {
foo();
return 0;
}
输出示例
Caller return address: 0x55a1b2c3d149
典型应用场景
- 调试与日志追踪
- 在关键函数中打印“谁调用了我”,辅助定位调用链。
#define LOG_CALLER() do { \
printf("[%s] called from %p\n", __func__, __builtin_return_address(0)); \
} while(0)
- 安全检测(如 Canary、Control Flow Integrity)
- 检查返回地址是否被篡改(栈溢出攻击防护)。
- 轻量级堆栈回溯(Stack Walking)
- 结合 __builtin_frame_address 可手动遍历调用栈(但不如 backtrace() 完整)。
- 性能分析
- 在热点函数中记录调用来源,分析调用频次。
总结
__builtin_return_address(level) 是 GCC 提供的运行时获取调用栈返回地址的高效方式。主要用于调试、安全、日志,但需注意编译器优化和架构差异。在生产代码中谨慎使用,避免依赖其行为做关键逻辑判断。
更多推荐

所有评论(0)