當(dāng)前位置:首頁 > 公眾號精選 > 小麥大叔
[導(dǎo)讀]何為斷言斷言一般是用于檢測在某個程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:前置條件:在某個程度點開始的地方后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測執(zhí)行結(jié)果斷言發(fā)生表示程序中存在錯誤。因此,斷言是提高程序可靠性的有效手段。也是開發(fā)階段快速定位問題的一種很好...

何為斷言

斷言一般是用于檢測在某個程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:


  • 前置條件:在某個程度點開始的地方


  • 后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測執(zhí)行結(jié)果


斷言發(fā)生表示程序中存在錯誤。因此,斷言是提高程序可靠性的有效手段。也是開發(fā)階段快速定位問題的一種很好防御式編程方法。


C語言中,斷言是一些條件判斷的宏。比如C語言內(nèi)置斷言是用標(biāo)準(zhǔn)的 assert 宏實現(xiàn)的。當(dāng)宏執(zhí)行時,assert 的參數(shù)必須為真,否則程序中止并打印錯誤消息。


比如,在IAR中:


#define assert(test) ((test) ? (void) 0 : abort())
也可以編程者自己定義,比如:


#define assert(arg) { if( !(arg) ) { printf("assert in File="__FILE__" Line=%d ",__LINE__); return; } }

該怎么用

前置條件

比如某一個函數(shù)代碼:


#define ALLOWED_SIZE  (1024)
int func(int size, char *buffer )
{
assert( size <= ALLOWED_SIZE );
assert( format != NULL );
...
}
這個函數(shù)里,使用了兩次斷言判斷函數(shù)執(zhí)行的前置條件:


  • size必須要不大于ALLOWED_SIZE,func函數(shù)才真正執(zhí)行其任務(wù)。因此,如果輸入的size超過1024,func不會做任何處理。
  • buffer傳入的地址必須不是NULL,否則func函數(shù)不會執(zhí)行。
具體斷言判斷失敗了,斷言宏干了什么,需要看看這個宏的實現(xiàn),有可能是直接返回,有可能整個程序直接終止執(zhí)行。所以看看其實現(xiàn)就知道了。


后置條件

后置條件斷言一般是指判斷函數(shù)的執(zhí)行結(jié)果。比如:


int func(int size, char *buffer )
{
int result;

/*中間處理部分更新這個返回值*/
...

assert( result <= ALLOWED_SIZE );
return result;
}
這樣寫表示這個函數(shù)的返回值永遠(yuǎn)不會大于ALLOWED_SIZE。如果大于了,就證明產(chǎn)生錯誤了。


什么時候用

斷言的最常用和最有效的用途是檢查前置條件——即指定和檢查函數(shù)的輸入條件。兩個非常常見的用途:


  • 指針不是 NULL。
  • 索引和邊界范圍值是在設(shè)計的合理范圍之類。
尤其如果寫一個代碼包給其他的人調(diào)用的時候,這樣處理會使代碼提高健壯性,易用性。


當(dāng)代碼調(diào)用帶有前置條件的斷言時,必須要確保滿足該函數(shù)的前置條件。但這并不意味著必須斷言檢查調(diào)用的每個函數(shù)的參數(shù)!


調(diào)試的便利:


  • 如果在程序測試和調(diào)試期間違反了前置條件,也就是說斷言異常了,則調(diào)用包含前置條件的函數(shù)的代碼中存在bug。


  • 如果在程序測試和調(diào)試期間違反了后置條件,則該斷言前面部分代碼可能有bug。


這樣利用斷言的打印,或者檢測到斷言指定的行為,就可以很快速的發(fā)現(xiàn)bug,而避免要在后期反復(fù)測試才能識別出bug。


那么什么時候用?首先,區(qū)分程序錯誤和運行時錯誤很重要:


  • 程序錯誤是一個bug,永遠(yuǎn)不應(yīng)該發(fā)生。
  • 運行時錯誤可能在程序執(zhí)行期間的任何時間發(fā)生。
斷言不是處理運行時錯誤的機制。例如,由于用戶在預(yù)期為正數(shù)時無意中輸入了負(fù)數(shù)而導(dǎo)致的斷言異常就是程序設(shè)計不合理。像這樣的情況必須通過適當(dāng)?shù)腻e誤檢查和恢復(fù)代碼(比如彈出一個提示輸入合理范圍)來處理,而不是通過斷言來處置。


當(dāng)然,實際是程序都可能會有bug,這些bug會在運行時出現(xiàn)。確切地說,斷言要檢查什么條件以及運行時錯誤檢查代碼要檢查什么是設(shè)計問題。


如前所說,斷言在可重用庫中非常有效。比如在QT中:


int main(int argc, char *argv[])
{
QVector <int> list;
list.append(0);
list.append(1);
qDebug() << list.at(2);

return 0;
}
一運行,就會有這樣的結(jié)果:


ASSERT failure in QVector::at: "index out of range", file C:\Qt\Qt5.7.1\5.7\mingw53_32\include/QtCore/qvector.h, line 429
assert in File=..\src\main.cpp Line=4
因為list只有兩個元素,list.at(2)則是去訪問第3個,顯然訪問的元素不存在,所以就斷言了。



—— The End —





本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉