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