你真的會使用assert嗎?

2021-09-20 14:37:12 字數 1458 閱讀 8281

寫這篇部落格源於在閱讀lighttpd源**是遇到的乙個關於assert應用的疑問。

buffer* buffer_init(void)
這裡的assert(b)似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀《writing solid code 》一書時找到了答案。

對assert的基本用法就不再累述了,下面總結一下assert的實際應用的recommended practice吧:

1、要使用斷言對函式引數進行確認 

主要有以下情況:

2、每個斷言必須在標頭檔案中的函式功能描述的斷言部分進行說明(不要浪費別人的時間 ─── 詳細說明不清楚的斷言 ),例如:

*  asserts:

* 'size' is no greater then limit.

* 'format' is not null.

* the function result is no greater than limit.

*/

如果沒有斷言, 寫 「nothing」:

*  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 建立...