?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
這種對(duì) C 語(yǔ)言的可選擴(kuò)展限制了執(zhí)行某些形式的未定義行為的潛在結(jié)果,這提高了此類程序的靜態(tài)分析的有效性。如果預(yù)定義的宏常量__STDC_ANALYZABLE__
(C11)由編譯器定義,則只能保證可分析性。
如果編譯器支持可分析性,那么其行為未定義的任何語(yǔ)言或庫(kù)構(gòu)造會(huì)進(jìn)一步分類為關(guān)鍵和有界的未定義行為,并且所有有界 UB 情況的行為都受到限制,如下所述。
嚴(yán)重的 UB 是未定義的行為,可能會(huì)執(zhí)行內(nèi)存寫(xiě)入或讀取任何對(duì)象邊界的易失性內(nèi)存。具有嚴(yán)重未定義行為的程序可能容易受到安全漏洞攻擊。
只有以下未定義的行為至關(guān)重要:
訪問(wèn)其生命周期之外的對(duì)象(例如,通過(guò)懸掛指針)
寫(xiě)入聲明不兼容的對(duì)象
函數(shù)通過(guò)一個(gè)函數(shù)指針調(diào)用,該指針的類型與它指向的函數(shù)的類型不兼容
評(píng)估左值表達(dá)式,但不指定對(duì)象
嘗試修改字符串文字
解引用無(wú)效(空,不確定等)或過(guò)去結(jié)束指針
通過(guò)非const指針修改const對(duì)象
使用無(wú)效參數(shù)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)或宏
使用意外的參數(shù)類型調(diào)用可變參數(shù)標(biāo)準(zhǔn)庫(kù)函數(shù)(例如,printf
使用與其轉(zhuǎn)換說(shuō)明符不匹配的參數(shù)調(diào)用)
longjmp
沒(méi)有setjmp
調(diào)用范圍,跨線程或VM類型的范圍內(nèi)。
任何使用由free
or 釋放的指針realloc
任何字符串或?qū)捵址畮?kù)函數(shù)都會(huì)訪問(wèn)數(shù)組越界
有界 UB 是未定義的行為,不能執(zhí)行非法的內(nèi)存寫(xiě)入,盡管它可能會(huì)陷入并可能產(chǎn)生或存儲(chǔ)不確定的值。
所有未定義的行為都未被列為關(guān)鍵性的,包括
多線程數(shù)據(jù)競(jìng)賽
使用具有自動(dòng)存儲(chǔ)持續(xù)時(shí)間的不確定值
嚴(yán)格的走樣違規(guī)
錯(cuò)位的對(duì)象訪問(wèn)
有符號(hào)整數(shù)溢出
無(wú)序的副作用修改相同的標(biāo)量或修改并讀取相同的標(biāo)量
浮點(diǎn)到整數(shù)或指針到整數(shù)的轉(zhuǎn)換溢出
按位移動(dòng)一個(gè)負(fù)數(shù)或太多的位數(shù)
整數(shù)除以零
使用void表達(dá)式
直接分配或memcpy
不精確重疊的對(duì)象
限制違規(guī)
所有未定義的行為都不在關(guān)鍵列表中。
注意
有界的未定義行為會(huì)禁用某些優(yōu)化:?jiǎn)⒂每煞治鲂缘木幾g會(huì)保留源代碼因果關(guān)系,否則可能會(huì)違反未定義的行為。
分析性擴(kuò)展允許在發(fā)生陷阱時(shí)調(diào)用運(yùn)行時(shí)約束處理程序,作為實(shí)現(xiàn)定義的行為的一種形式。
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.10.8.3/1條件特征宏(p:177)
附件L可分析性(p:652-653)