論怎么提高程序的健壯性


 

 

程序健壯性的提高要從設計、實現、測試三方面入手,具體來說

1. 設計

1. 系統

  • 系統外部模塊的異步響應都需要設置超時時間,要有超時處理,超時時間要和外部模塊協商一個合理時間。

  • 發送消息失敗和設置timer失敗統一做處理。

  • 需要設計相關機制(比如心跳包機制)監控進程/線程是否發生了堵塞,發生堵塞后需要設計相應的處理流程。

  • 需要設計相關機制來監控CPU的占有率,當CPU占有率超過閾值后要設計相應的處理流程。

2. 模塊

  • 系統內部所有需要等待的異步響應都要有超時處理。

  • 關聯組件的行為不一致要做異常處理:比如:APP模塊認為通信已經斷開,故不會再次請求通信MID模塊去執行通信,而通信MID模塊等待APP模塊來觸發下一次通信。

  • 模塊內部暫態都要設置最長停留時間,以及超過這個時間后做什么樣的處理。

  • 模塊的錯誤處理至少要考慮以下幾種類型錯誤:

    1. 輸入了范圍外的值

    2. 在規定時間內,處理沒有結束或者沒有應答

    3. 與期待的時序不一致

    4. 期待的數據不完整:

  • 由錯誤轉化為異常的判定標准:

    • 不以單次Error做判定,而是執行一定次數(3次)的Retry處理。

    • 測試時間以大於一定時間為目標 。

  • 通信關聯的功能模塊在設計時需要考慮:

    • 用戶異常切斷時怎么處理

    • 通信正常切斷時怎么處理

    • 通信正常終了時怎么處理

    • 設備異常切斷時怎么處理"

  • 做狀態遷移表的設計時,如果狀態遷移表的事件有外部設備異常切斷的通知。要明確各狀態下收到該通知時處理的妥當性,並且明確這些設計。

  • 需要考慮起動處理時各模塊消息的同步問題。例如,優先級高的A模塊啟動后,發送消息給后B模塊,考慮如果此時B模塊未啟動的處理情況。

  • 對於Backup的數據,需要考慮Backup各種狀態下啟動之后處理:

    1 沒有讀取到Backup數據
    2 Backup數據為初始值
    3 Backup數據達到最大邊界值
    4 Backup數據超過最大邊界值或者異常。
  • 備份的數據要有默認值。

  • 備份的數據要進行完整性校驗。

  • 設計模塊時,盡量保證此模塊可以有機制來恢復。

  • 模塊出現異常時,有一套機制可以檢測出來。

3. 函數

  • 輸入范圍之外的值需要做處理。

  • 函數設計時需要明確設計目標函數所調用函數的所有返回值。對正常值以外的返回值進行分析,分析不同的返回值是否需要做不同的異常處理。並且明確這些異常設計。

  • Loop循環,一定要設定跳出循環的條件或者是范圍的判定。

  • 進行數據的格式轉換的處理,需要明確:1 數據轉換前后的格式2 轉換規則3 是否有數據在轉換時需要特殊處理,比如邊界值。

2. 實現

  • 不允許使用C語言中非安全的經典函數,如下:

    • strcpy/wcscpy/stpcpy/ wcpcpy

    • scanf/ sscanf /vscanf /fwscanf /swscanf/ wscanf

    • gets/ puts

    • strcat /wcscat

    • wcrtomb /wctob

    • sprintf/ vsprintf /vfprintf

    • asprintf/ vasprintf

    • strncpy /wcsncpy

    • strtok/ wcstok

  • 代碼滿足靜態檢查規范(cert C,misra C)。

  • 函數的入參要進行范圍判斷。

  • 不允許使用函數的遞歸。

  • 優先使用RAII技術來管理資源(使用C++語言),比如鎖,文件句柄等。

  • 優先使用引用來代替裸指針(使用C++語言)。

  • 優先使用智能指針代替裸指針(使用C++語言)。

  • 盡量避免強制類型轉換。

3.測試

1. 測試用例

測試用例至少覆蓋以下幾種情況:

  • 基本功能:典型時序(所有的錯誤;異步超時需要重點關注)。

  • 性能:性能相關時序。

  • 邊界值:外部輸入所有的邊界值。

  • 異常值:接口中數據范圍異常;時序重復混亂;備份數據損壞;服務器來的數據破壞;總線上數據異常等 。

  • 惡意操作:ACC ON,OFF頻繁操作;外部線惡意插拔;外部沒有得到結果就再次請求;外部連續兩個相反的請求;外部連續兩個不同的請求等。

  • 內部狀態:內存使用量大時;CPU占有率大時;各種電源狀態下 。

  • 外部狀態:總線負載大時;Linux下2038問題;MQTT/HTTP同時進行;正常功能和debug功能同時進行。OTA/diag/factory reset處於執行中時。

2. 測試工具

  • 測試用例要能支持回歸測試。

  • 搭建自動化測試環境。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM