assert在C語言中稱為斷言,用來提示一些可能存在的錯誤。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網絡空間、營銷軟件、網站建設、前進網站維護、網站推廣。
編寫代碼時,做出一些假設,斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新起用斷言。
技巧1:記住ASSERT的定義
對許多開發人員來說,斷言是一個令人困惑的話題,因為它們的許多使用方式與其設計初衷背道而馳。我見到的最清晰的斷言定義是這樣的:
“斷言是在程序某個特定點的一個布爾表達式,除非程序中有缺陷(Bug),否則它的值將為真?!?/p>
想要理解上述斷言定義的開發人員應該留意下面三個要點:
·斷言會評估一個表達式是真還是假
·斷言是在代碼中的某個點對系統狀態的一種假設
·斷言會驗證系統假設,如果不為真,就表明代碼中有一個缺陷
技巧2:使用ASSERT驗證函數的先決條件
斷言非常適合契約式設計環境,在這種環境中,開發人員非常清晰地定義了某個函數的先決條件。斷言可以用來檢查該函數的輸入是否滿足先決條件。就拿圖1所示的代碼片段為例:
圖1:函數的先決條件
函數的STate輸入應該在定義的系統狀態范圍內。如果State不是有效的狀態值,那么它就不是錯誤,而是缺陷!斷言可以用來驗證State是有效的假設,如圖2所示:
圖2:對函數先決條件應用斷言
在State不小于最大值的事件中,斷言表達式將被評估為假,程序于是將停止執行。停止程序執行可以讓開發人員很容易馬上看到哪里的代碼出錯,而不是過段時間以后才知道。
技巧3:使用ASSERT驗證函數的后置條件
斷言也能用來驗證契約式設計環境中對某個函數輸出的假設。例如,如果前面定義的System_StateSet函數返回SystemState變量,開發人員可以預計它也在期望的范圍之內。斷言可以用來對缺陷進行監視,如圖3所示。
圖3:對函數后置條件應用斷言
開發人員在查看上述代碼后可能會感到這些檢查毫無意義。剛剛才設置好的SystemState怎么就會出現大于SYSTEM_STATE_MAX的值呢?答案是這確實不應該出現,然而有時候會莫名其妙地發生改變,也許是通過中斷或并行線程,此時斷言可以立即標志出這個缺陷。
技巧4:不要把ASSERT用于錯誤處理
在記住斷言定義之后,開發人員應該切記:斷言是用于檢測缺陷的,不能用于錯誤處理。錯誤處理是設計用于響應錯誤的用戶輸入和意外的事件順序的軟件。錯誤在系統中預料是會發生的,但僅僅是因為有無效的輸入而并不意味著代碼中有缺陷。錯誤處理應該與缺陷尋找分開來。錯誤使用斷言的一個典型例子是,在試圖打開一個文件用于讀取時去檢查文件的指針,如圖4所示。
圖4:ASSERT的不當使用
讀者可以清楚地看到,試圖打開文件的結果與文件系統的狀態和用戶數據有關,而與代碼中的缺陷一點關系也沒有。開發人員應該編寫錯誤處理程序,而不是用斷言,以便在文件不存在時,錯誤處理程序可以用一些默認可用數據來創建它,以便后續代碼繼續操作。
技巧5:ASSERT僅對開發有意義,不能用于生產
開發ASSERT宏的原始意圖是在開發過程中啟用它,在后面生產時要禁用??梢杂肗DEBUG宏激活和禁用ASSERT。正確實施的斷言在被禁用后應該對嵌入式系統基本沒有影響。
問題是,如果測試是在斷言啟用的情況下進行的(為了捕捉任何缺陷,應該這樣做),那么現在禁用斷言將導致交付的產品與測試的產品處于不同的狀態。斷言確實會占用一些代碼空間,但更重要的是,它們需要占用少量的時鐘周期來評估它們的布爾表達式。禁用ASSERT可能對具有有限資源的裸機系統的執行時序產生很大影響,從而導致在生產系統中產生新的缺陷。開發團隊需要判斷是否值得冒關閉斷言的.風險。
一種替代方案是保留斷言在激活狀態,而將它們的輸出重定向到一個系統日志。這樣可以確保任何揮之不去的缺陷很容易被識別,而且能避免中止系統的運行,而中止系統可不是明智之舉。
技巧6:不允許斷言有副作用
ASSERT的默認實現允許開發人員包含一段可執行代碼作為布爾表達式的一部分。舉例來說,一個狀態變量可以被實現為表達式的一部分并傳遞給ASSERT。但如果傳遞給ASSERT的表達式有副作用,也就是說,它會改變嵌入式系統的狀態,那么禁用斷言將改變系統的行為。開發人員應該確保他們的表達式沒有副作用,否則他們需要冒險在系統中增加只針對產品代碼喚醒的休眠時間缺陷。
技巧7:斷言應該占代碼的1%至3%
每個開發人員對于代碼庫(Code Base)中應該有多少個斷言都有自己的主見。大家一致同意的一個數字是,代碼庫中的斷言占比應該大于0。斷言為開發人員提供了一種在代碼庫中發生缺陷的時刻發現它的好方法。調試是在開發嵌入式系統中最浪費時間并令人沮喪的事情之一。不管開發人員認可的占比是1%、3%還是5%,使用斷言肯定對你有利,并會使開發嵌入式軟件變得多少有些趣味。
技巧8:將斷言用作可執行代碼注釋
斷言可以生成極好的注釋!編寫出色的表達式可以確切地告訴開發人員在代碼的某個給定點應該預料發生什么事情。開發人員應該做好他們斷言的架構,幫助人們更清楚地理解系統中發生的事情,進而幫助減少缺陷。
小結
斷言是一種出色的工具,但有太多的嵌入式軟件開發人員忽視了這一工具。本文討論的八個技巧只是如何正確使用斷言的冰山一角。接下來讀者就可以在測試平臺中建立和開始使用斷言,并研究它們在實際的嵌入式系統中是如何工作的。
一、assert的基本意思是“堅持”“斷言”,即做主觀的、自信的、有說服力的闡述。
二、這種“主張”或“斷言”盡管有時并無憑據,但是要讓別人相信自己的話是有依據的,或要別人對憑據感興趣。
1、讀音:英 [??s??t]?? 美 [??s??rt]?
2、釋義:明確肯定,斷言。
3、語法:assert表示“主張,斷言”,指宣稱某事如此,并不說它是事實,著重主觀自信心。
4、例句:He's?speaking?up?and?asserting?himself?confidently. 他明確表態,信心十足地闡述自己的觀點。
擴展資料
近義詞:declare
1、讀音:英 [d??kle?(r)]?? 美 [d??kler]?
2、釋義:宣告,表明,宣稱。
3、語法:declare的基本意思是明確地、清楚地、正式地“宣布,宣告”,多用于官方場合。引申可指“宣稱”“斷言”“申報”等。
4、例句:Your?income?must?be?declared?on?this?form必須在這張表格上申報你的收入。
是程序調試很重要的手段,
ASSERT(
f
)
在Debug模式下,每次運行到這里后會計算括號中的表達式,如果表達式為0,則中斷執行,彈出一個警告框,用戶可選擇“繼續”,“重試”,“忽略”
在Release模式下,這句語句不會被編譯進代碼。
ASSERT一般用于程序內部確認參數的正確性,即調用內部函數的時候,要由調用者保證參數的正確,而被調用函數內部,就可以通過ASSERT來檢查參數是否滿足要求。
assert_param(IS_GPIO_MODE(GPIO_InitStruct-GPIO_Mode));
意思是:IS_GPIO_MODE(GPIO_InitStruct-GPIO_Mode)這個判斷條件必須為真,否則程序就會進入死循環。
一般assert用來判斷必須為真的一些條件,防止程序出現意外錯誤。
例如:
assert(汽車有4個輪子)//這個是必須成立的條件
開汽車
分享名稱:c語言中assert函數,c++assert
鏈接地址:http://m.kartarina.com/article32/hddjsc.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、靜態網站、關鍵詞優化、商城網站、網站導航、微信公眾號
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯