< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
斷言,用來DEBUG錯誤的,在DEBUG時發現然後跟蹤錯誤!
通常 寫一個程式給别人使用的,這個代碼在安全性上的要求是什麼呢?直覺上,我們都知道程式不應該崩。但是通常C/C++的程式如果把包含API的頭檔案暴露出來的話,根本沒辦法保證這一點。往往,如果一個C/C++的程式以頭檔案提供給别人使用的話,其安全性保證應該是“正确使用的時候一定不會崩,錯誤使用的時候盡最大可能的盡早崩”。
我剛知道assert的時候把assert的作用和異常搞混淆了,我以為assert和異常用途一樣,其實C标準寫得很明白,assert當條件不滿足的時候就會調用abort,abort就是制造程式崩潰。也就是說,assert的用處是上面所說的“錯誤使用的時候盡最大可能的盡早崩”。
錯誤使用是什麼意思呢?
首先,這裡的“錯誤使用”隻能是程式員的錯誤,而不應該是最終使用者進行了錯誤的操作,因為最終使用者永遠是沒錯的,最終使用者無論怎麼在你的GUI上亂點,或者在CUI輸入一些無論怎樣的稀奇古怪的東西,你都不能崩,你隻能一遍又一遍的告訴使用者,你不能這麼幹,不能那麼幹。
其次,C++提供給進階語言的接口,不能崩,從進階語言來的調用,無論參數是什麼,都不能算它誤用。比如說你用C++寫了一個COM控件,可以用來算整數的加法,然而客戶程式傳了一個字元串進來,你不能崩,你應該耐心的告訴客戶程式不應該傳字元串。否則使用者浏覽一個寫了錯誤的JavaScript的網頁時就會把浏覽器崩掉了。
最後,解析網絡協定的時候,不能崩,永遠不能信任網絡對面傳過來的協定是正确的,更不能依靠assert來確定這個正确性。
也就是說,assert的用處就僅限于保證你自己的C/C++代碼内部的代碼編寫正确,以及你通過一個C/C++頭檔案把一個庫提供給别人的時候的代碼編寫正确。而且,當你用assert來檢查客戶進行了錯誤的輸入的時候,你一定要在文檔注明,這樣的輸入是錯誤的,行為是未定義的。“未定義”的行為的最好結果就是崩掉,用assert就是為了保證能出現這個最好結果,而不是莫名其妙的繼續工作。要知道,“未定義”的行為就算是電腦爆炸掉都是符合邏輯的,當然,我們通常沒有看到電腦爆炸,這是因為作業系統保證你的未定義行為的危害範圍僅限于你的程序中。如果不是開玩笑的話,電腦爆炸的機率其實還是很小的,但是讓代碼跑飛到你不知道為什麼出錯那就相當普遍了。
本文轉自 netcorner 部落格園部落格,原文連結:http://www.cnblogs.com/netcorner/archive/2007/08/21/2912299.html ,如需轉載請自行聯系原作者