寫這篇部落格源於在閱讀lighttpd源**是遇到的乙個關於assert應用的疑問。
buffer* buffer_init(void)這裡的assert(b)似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀《writing solid code 》一書時找到了答案。
對assert的基本用法就不再累述了,下面總結一下assert的實際應用的recommended practice吧:
1、要使用斷言對函式引數進行確認
主要有以下情況:
2、每個斷言必須在標頭檔案中的函式功能描述的斷言部分進行說明(不要浪費別人的時間 ─── 詳細說明不清楚的斷言 ),例如:
* asserts:如果沒有斷言, 寫 「nothing」:* 'size' is no greater then limit.
* 'format' is not null.
* the function result is no greater than limit.
*/
* asserts:* nothing
*/
(以上的格式也許嚴格了一些,不過如果真的這麼做,對**的可閱讀性會很有幫助)3、斷言和錯誤校驗的區別
正確使用斷言,必須要清楚程式錯誤(program errors)和執行時錯誤(run- time errors)之間的區別;
乙個程式錯誤是乙個bug,永遠不應該發生。
乙個執行時錯誤是在程式執行的任何時候都可能會發生.
斷言並不是一種處理執行時錯誤的機制。例如在需要輸入正數的時候,使用者輸入了乙個負數,如果用斷言來檢測這種情況就不是好的設計。對於這種情況需要用合適的錯誤檢查和恢復處理的**來進行處理。
再回到lighttpd中對malloc函式的返回值進行assert斷言,我覺得也屬於這個問題,這應該是乙個執行時錯誤,而不是程式錯誤;所以,我覺得《c和指標》一書中對malloc返回null處理是通過乙個錯誤檢查分配器來處理的。
4、斷言和bug
斷言大致分為前置條件(preconditions)、後置條件(postconditions)、不變性條件(invariants)
如果前置條件不成立,發生assertion violations,則呼叫該函式的**存在bug,需要盡快找到並解決;
如果後置條件不成立,發生assertion violations,則(函式的)實現**存在bug,需要盡快找到並解決;
例如:
void doblah(int x)這段**說明這個函式的呼叫不可能傳入引數0,如果發生這種情況,說明呼叫這個函式的**存在bug;
以上是自己的一點理解,歡迎高手指正!!!
參考:how to use assertions in c
《writing solid code 》
你真的會使用assert嗎?
寫這篇部落格源於在閱讀lighttpd源 是遇到的乙個關於assert應用的疑問。複製 複製 buffer buffer init void 複製 複製 這裡的assert b 似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀 writing sol...
你真的會使用assert嗎?
寫這篇部落格源於在閱讀lighttpd源 是遇到的乙個關於assert應用的疑問。buffer buffer init void 這裡的assert b 似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀 writing solid code 一書時找...
你真的會使用命令模式嗎?
命令模式是一種資料驅動設計模式,它屬於行為型模式,請求以命令的形式包裹在物件中,並傳給呼叫物件,呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件。一 建立命令模式uml類圖 二 建立命令模式的步驟 1 建立命令介面command 2 建立命令接收者lightreceiver 3 建立...