[C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异

最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题。

后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过编译呢?

列子如下:

#include <iostream>

class Test {
public:
  bool yes();
};

bool Test::yes() {
  std::cout << "yes" << std::endl;
  // return false;
};

int main() {
  Test *t = new Test;
  bool r = t->yes();
  std::cout << "yes->" << r << std::endl;
  return 0;
}

用g++编译得到警告但是通过了,并且执行得到正确预期(但是值为啥是64?没有找到原因!)。

 gaojie@root-host:~$ g++ bool.cpp 
 bool.cpp: In member function ‘bool Test::yes()’:
 bool.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type]
    11 | };
       | ^
gaojie@root-host:~$ ./a.out  
yes
yes->64

用clang++编译同样类似警告也通过了,但执行出现异常指令。

 

gaojie@root-host:~$ clang++ bool.cpp 
bool.cpp:12:1: warning: non-void function does not return a value [-Wreturn-type]
};
^
1 warning generated.
gaojie@root-host:~$ ./a.out 
yes
非法指令 (核心已转储)

本着好奇的心理,就想知其原因为啥会有不一样的结果呢?就想通过汇编语法查询差异。

通过 https://godbolt.org/得到如下:

g++汇编指令如下:

 

clang++汇编指令如下:

 通过yes方法发现差异了,

gcc汇编有return指令可以正常返回。

而clang就ud2指令结束了,查阅相关资料得到,UD2是一种让CPU产生invalid opcode exception的软件指令.  内核发现CPU出现这个异常, 会立即停止运行.

问题原因找到了就是gcc和llvm对编译申明返回值方法而没有返回语句的处理结果是不一样的,g++保证通过而clang则认为无法处理(给了异常指令)退出程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值