__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

典型应用场景

  1. 调试与日志追踪
  • 在关键函数中打印“谁调用了我”,辅助定位调用链。
#define LOG_CALLER() do { \
    printf("[%s] called from %p\n", __func__, __builtin_return_address(0)); \
} while(0)
  1. 安全检测(如 Canary、Control Flow Integrity)
  • 检查返回地址是否被篡改(栈溢出攻击防护)。
  1. 轻量级堆栈回溯(Stack Walking)
  • 结合 __builtin_frame_address 可手动遍历调用栈(但不如 backtrace() 完整)。
  1. 性能分析
  • 在热点函数中记录调用来源,分析调用频次。

总结

__builtin_return_address(level) 是 GCC 提供的运行时获取调用栈返回地址的高效方式。主要用于调试、安全、日志,但需注意编译器优化和架构差异。在生产代码中谨慎使用,避免依赖其行为做关键逻辑判断。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐