C++ 禁止GCC生成调用指令作为函数的最后一条指令

C++ 禁止GCC生成调用指令作为函数的最后一条指令,c++,linux,gcc,assembly,backtrace,C++,Linux,Gcc,Assembly,Backtrace,切换到GCC 4.8后,我们注意到一些函数的代码以调用指令结尾,如下所示: 0000000000000167 <function_a>: 167: 55 push %rbp 168: 89 fe mov %edi,%esi 16a: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 171 <function_a+

切换到GCC 4.8后,我们注意到一些函数的代码以调用指令结尾,如下所示:

0000000000000167 <function_a>:
 167:   55                      push   %rbp
 168:   89 fe                   mov    %edi,%esi
 16a:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # 171 <function_a+0xa>
                        16d: R_X86_64_PC32      .LC0-0x4
 171:   31 c0                   xor    %eax,%eax
 173:   48 89 e5                mov    %rsp,%rbp
 176:   e8 00 00 00 00          callq  17b <function_a+0x14>
                        177: R_X86_64_PLT32     function_c-0x4
 17b:   48 8d 0d 00 00 00 00    lea    0x0(%rip),%rcx        # 182 <function_a+0x1b>
                        17e: R_X86_64_PC32      .rodata+0x6afc
 182:   48 8d 35 00 00 00 00    lea    0x0(%rip),%rsi        # 189 <function_a+0x22>
                        185: R_X86_64_PC32      .LC1-0x4
 189:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # 190 <function_a+0x29>
                        18c: R_X86_64_PC32      .LC2-0x4
 190:   ba 88 00 00 00          mov    $0x88,%edx
 195:   e8 00 00 00 00          callq  19a <function_b>
                        196: R_X86_64_PLT32     __assert_fail-0x4

000000000000019a <function_b>:                                            
 19a:   55                      push   %rbp
 ...
我们的程序试图在某些错误情况下收集回溯,但在这种情况下我们的算法被破坏,因为返回地址属于另一个函数

有没有办法禁止GCC生成这种类型的函数end?

这可能是因为uu assert\u fail被标记为noreturn,这样编译器就不用麻烦生成更多的代码了。调用本身当然是有效的,因为源代码可能使用函数调用,例如if!条件断言失败;不知道它是怎么搞砸的。你可以试试-fno优化兄弟调用。我不知道它是否会起作用,但它可能会起作用。