奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

C語言中用ASSERT調試的8大技巧

時間:2025-05-25 23:01:50 C語言 我要投稿
  • 相關推薦

C語言中用ASSERT調試的8大技巧

  assert宏的原型定義在中,其作用是如果它的條件返回錯誤,則終止程序執行。以下是百分網小編搜索整理的關于C語言中用ASSERT調試的8大技巧,需要的朋友可以參考一下!想了解更多相關信息請持續關注我們應屆畢業生考試網!

  技巧1:記住ASSERT的定義

  對許多開發人員來說,斷言是一個令人困惑的話題,因為它們的許多使用方式與其設計初衷背道而馳。我見到的最清晰的斷言定義是這樣的:

  “斷言是在程序某個特定點的一個布爾表達式,除非程序中有缺陷(Bug),否則它的值將為真。”

  想要理解上述斷言定義的開發人員應該留意下面三個要點:

  ·斷言會評估一個表達式是真還是假

  ·斷言是在代碼中的某個點對系統狀態的一種假設

  ·斷言會驗證系統假設,如果不為真,就表明代碼中有一個缺陷

  技巧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宏的原始意圖是在開發過程中啟用它,在后面生產時要禁用。可以用NDEBUG宏激活和禁用ASSERT。正確實施的斷言在被禁用后應該對嵌入式系統基本沒有影響。

  問題是,如果測試是在斷言啟用的情況下進行的(為了捕捉任何缺陷,應該這樣做),那么現在禁用斷言將導致交付的產品與測試的產品處于不同的狀態。斷言確實會占用一些代碼空間,但更重要的是,它們需要占用少量的時鐘周期來評估它們的布爾表達式。禁用ASSERT可能對具有有限資源的裸機系統的執行時序產生很大影響,從而導致在生產系統中產生新的缺陷。開發團隊需要判斷是否值得冒關閉斷言的風險。

  一種替代方案是保留斷言在激活狀態,而將它們的輸出重定向到一個系統日志。這樣可以確保任何揮之不去的缺陷很容易被識別,而且能避免中止系統的運行,而中止系統可不是明智之舉。

  技巧6:不允許斷言有副作用

  ASSERT的默認實現允許開發人員包含一段可執行代碼作為布爾表達式的一部分。舉例來說,一個狀態變量可以被實現為表達式的一部分并傳遞給ASSERT。但如果傳遞給ASSERT的表達式有副作用,也就是說,它會改變嵌入式系統的狀態,那么禁用斷言將改變系統的行為。開發人員應該確保他們的表達式沒有副作用,否則他們需要冒險在系統中增加只針對產品代碼喚醒的休眠時間缺陷。

  技巧7:斷言應該占代碼的1%至3%

  每個開發人員對于代碼庫(Code Base)中應該有多少個斷言都有自己的主見。大家一致同意的一個數字是,代碼庫中的斷言占比應該大于0。斷言為開發人員提供了一種在代碼庫中發生缺陷的時刻發現它的好方法。調試是在開發嵌入式系統中最浪費時間并令人沮喪的事情之一。不管開發人員認可的占比是1%、3%還是5%,使用斷言肯定對你有利,并會使開發嵌入式軟件變得多少有些趣味。

  技巧8:將斷言用作可執行代碼注釋

  斷言可以生成極好的注釋!編寫出色的表達式可以確切地告訴開發人員在代碼的某個給定點應該預料發生什么事情。開發人員應該做好他們斷言的架構,幫助人們更清楚地理解系統中發生的事情,進而幫助減少缺陷。

  小結

  斷言是一種出色的工具,但有太多的嵌入式軟件開發人員忽視了這一工具。本文討論的八個技巧只是如何正確使用斷言的冰山一角。接下來讀者就可以在測試平臺中建立和開始使用斷言,并研究它們在實際的嵌入式系統中是如何工作的。

【C語言中用ASSERT調試的8大技巧】相關文章:

C語言中用ASSERT調試的八大技巧06-18

在C語言中用ASSERT調試的八個技巧02-23

C語言assert的用法06-02

assert用法(C語言)05-30

C語言assert用法06-24

C語言的assert斷言宏03-10

C語言中assert用法02-26

C語言中assert的用法06-02

C語言中的assert用法04-07

主站蜘蛛池模板: 铜川市| 广德县| 沁源县| 盐池县| 阿坝县| 灌云县| 朔州市| 海门市| 洛浦县| 得荣县| 江源县| 河北省| 元阳县| 泌阳县| 藁城市| 无棣县| 白河县| 永吉县| 四子王旗| 易门县| 昭觉县| 资中县| 句容市| 册亨县| 兴隆县| 康定县| 中方县| 瑞昌市| 花垣县| 湛江市| 茂名市| 古蔺县| 曲阳县| 师宗县| 吕梁市| 吉木乃县| 大姚县| 清流县| 东阿县| 禄丰县| 饶河县|