20-获取函数的返回地址
获取函数的返回地址
GCC提供了一个关键字,可以获取当前函数的返回值,或者当前函数的某个调用:
参数level指定调用链中的返回值函数。如果level值为0,表示返回当前函数的地址,如果level值为1,表示返回当前函数的调用方地址,如果level值为2,表示该函数调用方的返回地址等等。
如果当前函数是个内联函数,返回的地址是调用函数的地址。如果不想使用这种方式,就使用关键字noinline(在本附录前面“避免内联”一节中提到),强制编译器不要对函数进行内联。
关键字__builtin_return_address有几个用途。一种是出于调试或信息目的,另一种是展开调用链,实现代码自检、导出代码崩溃信息、调试器等等。
注意,有些体系结构只能返回调用函数的地址。在这种体系结构上,非0参数值会生成随机返回值。因此,除了0之外的任何值都是不可移植的,只能用于调试目的。