首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 函數缺少返回值導致未定義行為:棧垃圾值被誤認為返回值

     編輯:程式設計綜合問答

代碼:

int fun(int a, int b) {
    if (a == b) return a;
    // 無 else 分支,無返回語句
}
int main() {
    int x=20, y=10, z=fun(x,y);
    cout << z; // 輸出 20 (巧合)
}

原因分析

  • C++ 標準規定:非 void 函數執行到末尾未返回,行為未定義 (UB)。
  • x86 調用約定 (cdecl) 下,返回值放在 EAX 寄存器。
  • 調用者 `push y; push x; call fun`,參數入棧順序:`y` 在棧頂,`x` 在次頂。
  • `fun` 內部 `if` 判斷失敗,直接 `ret`,未修改 `EAX`。
  • 此時 `EAX` 殘留值恰為調用者壓棧前的 `x` (20) —— **純屬巧合**,換優化等級、編譯器、調用約定即會不同。

嚴重後果

  • Release 模式下編譯器可能假設 UB 不發生,刪除整個調用、甚至後續代碼。
  • 跨平台移植 (ARM/MIPS) 立即崩潰或輸出隨機數。

修正

int fun(int a, int b) {
    if (a == b) return a;
    return 0; // 或 -1, 或拋出異常,明確語義
}

開啟編譯器警告 -Wreturn-type (GCC/Clang) / /Wall (MSVC) 可在編譯期捕獲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved