[C++]

2022-11-12 18:00:29

  最近做一個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 functionbool 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指令可以正常返回。

而clang就ud2指令結束了,查閱相關資料得到,UD2是一種讓CPU產生invalid opcode exception的軟體指令.  核心發現CPU出現這個異常, 會立即停止執行.

 

問題原因找到了就是gcc和llvm對編譯申明返回值方法而沒有返回語句的處理結果是不一樣的,g++保證通過而clang則認為無法處理(給了異常指令)退出程式。