C++里一個帶有返回值的函數在沒有return語句的情況下在GCC里編譯通過是否可看作GCC的bug?
01-11
不能看作是 Bug。
---
因為「在有返回值的函數里不 return」屬於未定義行為:
§6.6.3/2 C++03 C++11 C++14
Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.
而「未定義行為」沒有必要導致編譯失敗:
§1.3.13 C++03 / §1.3.24 C++11 C++14
Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).
當然有一個特例就是 main,沒有 return 等於結尾有個 return 0:
§3.6.1/5 C++03 C++11 C++14
If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;
自然也就不會導致編譯失敗。
當然不算,clang裡面也只是warning而已,C/C++相信程序員會做正確的事。
不看做bug如果 main 函數的最後沒有寫 return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入 return 0 ,表示程序正常退出。
推薦閱讀:
※GCC中-O1 -O2 -O3 優化的原理是什麼?
※int 在VS debug win32和debugx64下的區別?
※一段程序在gcc 5.4下編譯後,執行發生段錯誤,在gcc 4.4.7下編譯後,執行正常,什麼原因?
※C++在類模板中如何定義友元函數為同類型的模板函數?