[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?沒有找到原因?。?。
1 gaojie@root-host:~$ g++ bool.cpp2 bool.cpp: In member function ‘bool Test::yes()’:3 bool.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type]411 | };5| ^6 gaojie@root-host:~$ ./a.out7 yes8 yes->64用clang++編譯同樣類似警告也通過了,但執行出現異常指令 。
gaojie@root-host:~$ clang++ bool.cppbool.cpp:12:1: warning: non-void function does not return a value [-Wreturn-type]};^1 warning generated.gaojie@root-host:~$ ./a.outyes非法指令 (核心已轉儲)本著好奇的心理,就想知其原因為啥會有不一樣的結果呢?就想通過匯編語法查詢差異 。
【[C++] - GCC和LLVM對方法 warning: non-void function does not return a value [-Wreturn-type] 的處理差異】通過 https://godbolt.org/得到如下:
g++匯編指令如下:

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

文章插圖
clang++匯編指令如下:
[C++] - GCC和LLVM對方法 warning: non-void function does not return a value [-Wreturn-type] 的處理差異

文章插圖
通過yes方法發現差異了,
gcc匯編有return指令可以正常返回 。
而clang就ud2指令結束了,查閱相關資料得到,UD2是一種讓CPU產生invalid opcode exception的軟件指令.  內核發現CPU出現這個異常, 會立即停止運行.
問題原因找到了就是gcc和llvm對編譯申明返回值方法而沒有返回語句的處理結果是不一樣的,g++保證通過而clang則認為無法處理(給了異常指令)退出程序 。

    推薦閱讀