釣魚累了,寫下斷言怎么用
時(shí)間:2021-10-20 16:27:21
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀][導(dǎo)讀]大家好,我是逸珺。今天來分享整理如何正確的使用斷言。何為斷言斷言一般是用于檢測(cè)在某個(gè)程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:前置條件:在某個(gè)程度點(diǎn)開始的地方后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測(cè)執(zhí)行結(jié)果斷言發(fā)生表示程序中存在錯(cuò)誤。因此,斷言是...
[導(dǎo)讀] 大家好,我是逸珺。今天來分享整理如何正確的使用斷言。 —— The End?——
何為斷言
斷言一般是用于檢測(cè)在某個(gè)程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:- 前置條件:在某個(gè)程度點(diǎn)開始的地方
- 后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測(cè)執(zhí)行結(jié)果
#define?assert(test)?((test)???(void)?0?:?abort())
也可以編程者自己定義,比如:#define?assert(arg)?{?if(?!(arg)?)?{?printf("assert?in?File="__FILE__"?Line=%d?",__LINE__);?return;?}?}
該怎么用
前置條件
比如某一個(gè)函數(shù)代碼:#define?ALLOWED_SIZE??(1024)
int?func(int?size,?char?*buffer?)?
{
??assert(?size?<=?ALLOWED_SIZE?);
??assert(?format?!=?NULL?);
??...
}
這個(gè)函數(shù)里,使用了兩次斷言判斷函數(shù)執(zhí)行的前置條件:- size必須要不大于ALLOWED_SIZE,func函數(shù)才真正執(zhí)行其任務(wù)。因此,如果輸入的size超過1024,func不會(huì)做任何處理。
- buffer傳入的地址必須不是NULL,否則func函數(shù)不會(huì)執(zhí)行。
后置條件
后置條件斷言一般是指判斷函數(shù)的執(zhí)行結(jié)果。比如:int?func(int?size,?char?*buffer?)?
{
?int?result;
?
?/*中間處理部分更新這個(gè)返回值*/
??...
??
??assert(?result?<=?ALLOWED_SIZE?);
??return?result;
}
這樣寫表示這個(gè)函數(shù)的返回值永遠(yuǎn)不會(huì)大于ALLOWED_SIZE。如果大于了,就證明產(chǎn)生錯(cuò)誤了。什么時(shí)候用
斷言的最常用和最有效的用途是檢查前置條件——即指定和檢查函數(shù)的輸入條件。兩個(gè)非常常見的用途:- 指針不是 NULL。
- 索引和邊界范圍值是在設(shè)計(jì)的合理范圍之類。
- 如果在程序測(cè)試和調(diào)試期間違反了前置條件,也就是說斷言異常了,則調(diào)用包含前置條件的函數(shù)的代碼中存在bug。
- 如果在程序測(cè)試和調(diào)試期間違反了后置條件,則該斷言前面部分代碼可能有bug。
- 程序錯(cuò)誤是一個(gè)bug,永遠(yuǎn)不應(yīng)該發(fā)生。
- 運(yùn)行時(shí)錯(cuò)誤可能在程序執(zhí)行期間的任何時(shí)間發(fā)生。
int?main(int?argc,?char?*argv[])
{
????QVector?<int>?list;
????list.append(0);
????list.append(1);
????qDebug()?<list.at(2);
????
????return?0;
}
一運(yùn)行,就會(huì)有這樣的結(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
因?yàn)閘ist只有兩個(gè)元素,list.at(2)則是去訪問第3個(gè),顯然訪問的元素不存在,所以就斷言了。