
1.6 C++實戰100例——未初始化內置類型讀取:未定義行為受眾初級工程師,能區分聲明與定義,知道int x;不會自動賦值為0。默認具備基礎 Linux 操作能力和 GDB 調試能力。場景錨定場景:你在代碼中聲明了一個局部int變量但未賦初值,在條件分支中讀取它。Debug 模式下運行正常(恰好棧上殘留值為0),Release 模式下程序輸出隨機值或表現異常。你懷疑是編譯器做了某種激進的優化,但不知道為什么。這篇文章給你一條編譯命令、一條 GDB 觀察命令和一條 Valgrind 檢測命令,直接看穿未初始化變量讀取在優化后如何變成不確定行為和程序崩潰。摘要未初始化的內置類型變量(如int、float、bool等)沒有確定的初值,讀取它們的行為是 C++ 標準明確規定的未定義行為。編譯器不會給局部棧變量自動賦零——它的初值就是棧幀上該位置在分配前的殘留字節內容(取決于之前的函數調用在該棧位置留下的數據)。更嚴重的是,在-O2優化下,編譯器可能基于"變量已被初始化"的假定做路徑分析,如果發現存在未初始化讀取路徑,可能將整個分支優化為恒真、恒假,甚至刪除后續代碼,導致難以追蹤的運行時異常。驗證方法:用-O0和-O2分別編譯運行同一段包