编程语言
首页 > 编程语言> > [C++] - GCC和LLVM对方法

[C++] - GCC和LLVM对方法

作者:互联网

最近做一个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?没有找到原因!)。

1 gaojie@root-host:~$ g++ bool.cpp 
2 bool.cpp: In member function ‘bool Test::yes()’:
3 bool.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type]
4    11 | };
5       | ^
6 gaojie@root-host:~$ ./a.out 
7 yes
8 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指令可以正常返回。

标签:C,C++,java,C#,php,编程,语言,新人,人群,计算机,入门,Python
来源: