向具有大量內存和電源的32位及更高處理器的轉變,使公司能夠在嵌入式開發(fā)中構建更多的增值功能和能力;這就是好處。缺點是,代碼的數量及其復雜性通常會導致影響應用程序安全性和安全性的故障。
是時候采取更好的方法了??梢栽谲浖姓业絻煞N關鍵類型的錯誤,并使用防止引入錯誤的工具來解決:
編碼錯誤:例如,試圖訪問數組邊界之外的代碼。這類問題可以通過執(zhí)行靜態(tài)分析來檢測。
應用程序錯誤:只有準確地知道應用程序應該做什么才能檢測到這些錯誤,這意味著根據需求進行測試。
解決這些錯誤,設計工程師將在通往更安全的代碼的道路上走很長的路。
1. 通過代碼檢查進行一點點預防
代碼中的錯誤與電子郵件和即時消息中的錯誤一樣容易發(fā)生。這些都是發(fā)生的簡單錯誤,因為工程師們很匆忙,沒有校對。但隨著復雜性的增加,出現了一系列設計錯誤,這些錯誤帶來了巨大的挑戰(zhàn)。復雜性催生了對系統(tǒng)如何工作、數據如何傳遞以及值如何定義的全新理解。無論錯誤是由復雜性還是嵌入式開發(fā)人員的人為問題引起的,它們都可能導致一段代碼試圖訪問數組邊界之外的值。而且,編碼標準捕捉到了這一點。
在C和C++世界中,80%的軟件缺陷是由錯誤或不明智的使用造成的20%的語言。編碼標準對已知存在問題的語言部分進行了限制。結果:避免了缺陷,大大提高了軟件質量。
大多數C和C++編程錯誤是由未定義的、實現定義的和未指定的行為引起的,這些行為是每個語言固有的,這導致軟件錯誤和安全問題。當有符號整數右移時,此實現定義的行為傳播高階位。根據編譯器工程師的使用,結果可能是0x40000000或0xC0000000,因為C沒有指定函數參數的求值順序。
C/C++語言中還有很多其他缺陷:使用goto或malloc等構造;有符號和無符號值的混合;或者是“聰明”的代碼,可能效率高、結構緊湊,但卻非常神秘和復雜,以至于其他人難以理解。這些問題中的任何一個都可能導致缺陷、突然變?yōu)樨撁娴闹狄绯?,或者使代碼無法維護。
編碼標準為這些疾病提供了預防措施。它們可以防止使用這些有問題的構造,防止嵌入式開發(fā)人員創(chuàng)建未記錄的、過于復雜的代碼,以及檢查樣式的一致性。甚至可以監(jiān)視諸如驗證未使用制表符或圓括號位于特定位置之類的事情。雖然這看起來很簡單,但遵循這種風格可以極大地幫助手動代碼審閱,并防止在另一個編輯器中查看代碼時由于不同的選項卡大小而導致的混亂—所有這些都會分散審閱者對代碼的注意力。
2. MISRA去營救
最著名的編程標準是MISRA指南,現在被許多提供某種程度MISRA檢查的嵌入式編譯器普遍采用。MISRA專注于C語言和C++語言中的問題構造和實踐,推薦使用一致的文體特征,同時停止建議。
MISRA指南提供了關于每個規(guī)則存在原因的有用解釋,以及該規(guī)則的各種例外情況的詳細信息,以及未定義、未指定和實現定義行為的示例。
大多數MISRA指南是“可判定的”,這意味著該工具可以識別是否存在違規(guī)行為;但有些是“不可判定的”,這意味著工具并不總是能夠推斷是否存在違規(guī)行為。
如果靜態(tài)分析工具無法訪問系統(tǒng)函數的源代碼,則傳遞給應該初始化它的系統(tǒng)函數的未初始化變量可能不會注冊為錯誤。有可能出現假陰性或假陽性。
編碼標準的嚴格性傳統(tǒng)上與汽車、飛機和醫(yī)療設備等關鍵應用的功能安全軟件相關聯。然而,代碼的復雜性、安全性的重要性以及創(chuàng)建易于維護和升級的高質量、健壯代碼的業(yè)務重要性使得編碼標準在所有開發(fā)操作中都至關重要。
通過確保錯誤不會首先引入到代碼中,嵌入式開發(fā)人員必須:減少了大量調試的需要,更好地控制進度,以及通過降低總體成本來控制投資回報率。
代碼檢查提供了一個具有巨大潛在好處的工具箱。
3. 用測試工具進行的一磅治療
雖然代碼檢查解決了許多問題,但應用程序錯誤只能通過測試產品是否做了它應該做的事情來發(fā)現,這意味著有需求。要避免應用程序錯誤,既需要設計正確的產品,也需要設計正確的產品。
設計正確的產品意味著預先建立需求,并確保需求和源代碼之間的雙向可追溯性,以便實現每個需求,并將每個軟件功能追溯到需求。任何不符合要求的缺失或不必要的功能都是應用程序缺陷。產品權利設計是確認開發(fā)的系統(tǒng)代碼滿足項目要求的過程。您可以通過執(zhí)行基于需求的測試來實現這一點。
4. 編碼的新習慣
毫無疑問,軟件復雜性及其錯誤隨著連接性、更快的內存、豐富的硬件平臺和特定的客戶需求而激增。采用最先進的編碼標準、度量代碼的指標、跟蹤需求以及實施基于需求的測試,為開發(fā)團隊提供了創(chuàng)建高質量代碼和減少責任的機會。
在沒有標準要求遵守的情況下,團隊采用這些新習慣的程度取決于公司對它們帶來的游戲變化的認可程度。采用這些實踐,無論產品是安全關鍵的還是安全關鍵的,都會使代碼的可維護性和健壯性日夜不同。干凈的代碼簡化了新功能的添加,簡化了產品維護,并將成本和進度保持在最低限度—所有這些特性都可以提高公司的投資回報率。
無論產品是否安全關鍵,這肯定是一個只能對嵌入式開發(fā)團隊有益的結果。