__builtin_return_address返回null为索引> 0?

我想获得调用者函数的返回地址。 我正在使用__builtin_return_address()函数,但如果我给大于0的索引值,它返回NULL

请帮助我,或告诉我任何其他function相同。

看到这个答案相关的问题。

__builtin_return_address是GCC和处理器特定的( 某些版本的Clang在一些处理器上还有某些优化不足),并记录为

在某些机器上,可能无法确定除当前函数之外的任何函数的返回地址

编译器可能会在没有相关信息的情况下优化一个函数(例如,当它被编译时使用-fomit-frame-pointer ,或者tail-calls ,或者通过函数内联 )。

所以可能你得到NULL因为信息不可用!

除了编译器优化的原因(其中IMO是你面临的问题的最可能的原因), 海湾合作委员会的文件很明显地说:

使用非零参数调用此函数可能会产生不可预知的影响,包括崩溃调用程序。 因此,当-Wframe-address选项有效时,将诊断被认为不安全的呼叫。 这种调用只能在调试情况下进行。

正如Basile所说,由于它是一个编译器内置的(阅读:非常特定的处理器和一个糟糕的主意使用)行为是格外松散的定义(因为它不是任何标准的要求,不必作出任何保证)。

只需使用backtrace(3) ,它符合POSIX标准,不依赖于编译器内置。