嵌入式系統(tǒng)在我們的日常生活中廣泛存在,,從消費(fèi)類電子、醫(yī)療設(shè)備,,到汽車,工業(yè)控制,,航空航天等,,它們的存在已經(jīng)成為我們生活中不可分割的一部分。隨著技術(shù)的不斷進(jìn)步和客戶需求的增加,,嵌入式系統(tǒng)和軟件變得越來(lái)越復(fù)雜,,同時(shí)產(chǎn)品的開(kāi)發(fā)周期變得越來(lái)越短。如何在短時(shí)間內(nèi)開(kāi)發(fā)出高質(zhì)量的軟件對(duì)產(chǎn)品的成功起著決定性的作用,。
本文將介紹如何應(yīng)用編碼標(biāo)準(zhǔn)和自動(dòng)化工具,,提高代碼質(zhì)量。
關(guān)于代碼質(zhì)量
代碼質(zhì)量總體上是指為軟件編寫的代碼的整體優(yōu)良水平,,一般可以通過(guò)下面一些指標(biāo)來(lái)評(píng)價(jià)代碼質(zhì)量:
可讀性:代碼應(yīng)該易于閱讀和理解,,即使是不熟悉項(xiàng)目的人也是如此。
可維護(hù)性:代碼應(yīng)該有條理和模塊化,,可以方便地修改和更新,。
可移植性:代碼應(yīng)該被設(shè)計(jì)易于在不同的平臺(tái)上使用。
可重用性:代碼應(yīng)該是可重用的,,可以在應(yīng)用程序的其他部分使用,。
可測(cè)試性:代碼應(yīng)該是易于進(jìn)行單元測(cè)試和集成測(cè)試的。
安全性:代碼應(yīng)該是安全的,,保護(hù)敏感數(shù)據(jù)并防止惡意攻擊,。
性能:代碼應(yīng)該是高效的,專注于優(yōu)化性能,,以最大限度地減少資源使用,。
對(duì)于嵌入式系統(tǒng),代碼質(zhì)量更加的重要,。嵌入式系統(tǒng)經(jīng)常是處理執(zhí)行關(guān)鍵任務(wù)功能的設(shè)備,。
如果嵌入式軟件存在代碼質(zhì)量問(wèn)題,可能會(huì)導(dǎo)致硬件設(shè)備的故障或安全漏洞,嚴(yán)重影響系統(tǒng)的正常運(yùn)行,。
編碼標(biāo)準(zhǔn)是提高代碼質(zhì)量的最佳實(shí)踐
基于歷史原因,,目前在嵌入式開(kāi)發(fā)中,主要還是使用C/C++高級(jí)編程語(yǔ)言,,而C/C++是一種不安全的語(yǔ)言,,包含大量未定義的行為,對(duì)于這些行為的不同解釋,,可能會(huì)導(dǎo)致未知或不確定的副作用,,其中一部分將會(huì)轉(zhuǎn)化為我們俗稱的“Bug”。比如C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的一些輸入輸出函數(shù),,字符串函數(shù)導(dǎo)致的緩沖區(qū)溢出的問(wèn)題,,指針未初始化風(fēng)險(xiǎn),重復(fù)釋放內(nèi)存等等,。
同時(shí),,軟件開(kāi)發(fā)執(zhí)行和實(shí)施的核心是“人”,也就是開(kāi)發(fā)人員,,在實(shí)踐過(guò)程中,,開(kāi)發(fā)人員可能會(huì)一次又一次無(wú)意地將相同類型的錯(cuò)誤寫入到他們的源代碼中。這一結(jié)論來(lái)自各種權(quán)威機(jī)構(gòu),,如NASA,、貝爾實(shí)驗(yàn)室和MITRE,它們進(jìn)行了多項(xiàng)調(diào)查和研究,。這些研究的結(jié)果是給出了最佳編程實(shí)踐或推薦的編程實(shí)踐,,它們可以有效識(shí)別有風(fēng)險(xiǎn)和不良的編碼行為。
有許多指南和編碼實(shí)踐可用于檢查常見(jiàn)錯(cuò)誤以及如何避免這些錯(cuò)誤來(lái)提高代碼質(zhì)量,,其中一些技術(shù)和實(shí)踐在實(shí)施過(guò)程中,,成為眾所周知的編碼標(biāo)準(zhǔn)。編碼標(biāo)準(zhǔn)是編碼規(guī)則,、指導(dǎo)方針和最佳實(shí)踐的集合,,它可以識(shí)別語(yǔ)言中容易引起B(yǎng)ug的行為,防止你在源代碼中做可疑的事情,,消除容易出現(xiàn)缺陷的代碼結(jié)構(gòu),,幫助你快速提高代碼質(zhì)量。
在嵌入式系統(tǒng)中,,MISRA-C/C++,,CERT-C/C++,CWE等已經(jīng)成為事實(shí)標(biāo)準(zhǔn),。特別是在汽車,、醫(yī)療和鐵路等安全關(guān)鍵型應(yīng)用中,,被IEC 61508、EN 50128和ISO 26262 等功能安全標(biāo)準(zhǔn)所要求,。
很多大公司都有相應(yīng)的代碼編程規(guī)范,,尤其是針對(duì)C語(yǔ)言,但這些編程規(guī)范往往與業(yè)界的編程標(biāo)準(zhǔn)(比如MISRA C)的側(cè)重點(diǎn)不同,。一般公司的編程規(guī)范更加注重代碼風(fēng)格,比如命名,,縮進(jìn),,括號(hào)的使用等,來(lái)提高可讀性,,而業(yè)界的編程標(biāo)準(zhǔn)更偏重于代碼的可維護(hù)性,,可移植性,可靠性和安全性,。在具體實(shí)踐中,,往往是需要這二者結(jié)合使用。
MISRA
MISRA C由汽車工業(yè)軟件可靠性協(xié)會(huì)開(kāi)發(fā),。它的目的是提高嵌入式系統(tǒng)環(huán)境中的代碼安全性,、可移植性和可靠性,特別是那些用 ISO C 編程的系統(tǒng),。
MISRA C標(biāo)準(zhǔn)的第一版“Guidelines for the use of the C language in vehicle based software”于1998年制定,,正式名稱為MISRA-C:1998。2004年進(jìn)行了一次更新“Guidelines for the use of the C language in critical systems”,,正式名稱為 MISRA-C:2004,。從1998年的vehicle based software到2004年的critical systems,因?yàn)镸ISRA協(xié)會(huì)發(fā)現(xiàn)MISRA C不僅汽車行業(yè)需要,,其他一些安全相關(guān)的行業(yè)也需要,。最新的MISAR C標(biāo)準(zhǔn)是MISRA-C:2012。
關(guān)于MISRA C,,很多開(kāi)發(fā)者都有一個(gè)誤解:MISRA C只適用于汽車電子嵌入式軟件開(kāi)發(fā),。對(duì)此,MISRA C的輪值主席Andrew Banks特意做了解釋說(shuō)明:雖然MISRA最開(kāi)始推出的時(shí)候主要是針對(duì)汽車行業(yè)的,,但由于它本身其實(shí)是在C/C++語(yǔ)言的基礎(chǔ)上,,加上了一些約束,去掉了一些讓人容易出錯(cuò)的編程方法,,保留了常用的寫法,,盡可能讓開(kāi)發(fā)者保持一致,提高可維護(hù)性和可移植性,,從而提高安全性和可靠性,,因此 MISRA 在飛機(jī),、機(jī)器人、無(wú)人機(jī),、醫(yī)療等其它的嵌入式行業(yè)也開(kāi)始流行起來(lái),,成為了全球公認(rèn)的嵌入式 C 編程標(biāo)準(zhǔn)。
CERT
CERT C/C++由卡內(nèi)基梅隆大學(xué)軟件工程研究所(SEI)的計(jì)算機(jī)緊急響應(yīng)小組 (CERT)部門創(chuàng)建和發(fā)布,,為C/C++編程語(yǔ)言的安全編碼提供規(guī)則和建議,,這些規(guī)則和建議的目標(biāo)是開(kāi)發(fā)安全、穩(wěn)定和可靠的系統(tǒng),。
CWE
CWE是基于社區(qū)開(kāi)發(fā)的一組影響信息安全的軟件和硬件缺陷列表,。它用通用語(yǔ)言描述和討論軟件和硬件的缺陷,可以作為缺陷識(shí)別,、緩解和預(yù)防工作的公共基線標(biāo)準(zhǔn),。因此,CWE可以幫助開(kāi)發(fā)人員和安全從業(yè)者檢查現(xiàn)有軟件和硬件產(chǎn)品的缺陷,,評(píng)估針對(duì)這些缺陷的工具的覆蓋率等,。
編碼標(biāo)準(zhǔn)的應(yīng)用對(duì)提高代碼質(zhì)量有立竿見(jiàn)影的作用。在Dr. Dobbs所做的一項(xiàng)研究中(Code Quality Improvement | Dr Dobb's),,引入編碼標(biāo)準(zhǔn)進(jìn)行符合性檢查后,,缺陷注入率降低了41%,這節(jié)省了大量測(cè)試時(shí)間,,既提高了代碼質(zhì)量,,又縮短了工程時(shí)間,從而加速了產(chǎn)品上市,。在這項(xiàng)研究中,,每個(gè)月的缺陷注入率是相當(dāng)穩(wěn)定的,直到該組織引入編碼標(biāo)準(zhǔn),,然后缺陷率急速下降(見(jiàn)下圖),。
隨著對(duì)標(biāo)準(zhǔn)遵從度的提高,質(zhì)量也隨之提高,,偏差越來(lái)越少,,缺陷率直線下降。
自動(dòng)化工具是實(shí)施編碼標(biāo)準(zhǔn)的最佳路徑
有了編碼標(biāo)準(zhǔn)后,,應(yīng)用標(biāo)準(zhǔn)意味著代碼除了需要遵守語(yǔ)言本身的規(guī)則外,,還需要遵守成百上千條編碼標(biāo)準(zhǔn)所包含的規(guī)則和要求。理論上,,我們可以通過(guò)人工來(lái)檢查每條編碼規(guī)則的實(shí)施情況,,但對(duì)于日益復(fù)雜的軟件顯然是力不從心的。大量的實(shí)踐表明,,應(yīng)用自動(dòng)化工具是實(shí)施編碼標(biāo)準(zhǔn),,提高代碼質(zhì)量的最佳路徑,。
自動(dòng)化工具中我們最熟悉的就是編譯器和鏈接器。高質(zhì)量的編譯器和鏈接器應(yīng)支持現(xiàn)代編程語(yǔ)言,,如最新的C和C++規(guī)范,,報(bào)告每個(gè)構(gòu)建步驟中可能出現(xiàn)的問(wèn)題,以便它生成懷疑的警告,,例如易失性變量或內(nèi)存訪問(wèn),,其評(píng)估順序可能會(huì)影響應(yīng)用程序的邏輯。警告是第一道靜態(tài)分析檢查,,絕不能忽視,,尤其是在功能安全設(shè)置中。最好的建議是通過(guò)更改編譯器設(shè)置將所有警告都視為錯(cuò)誤來(lái)將警告轉(zhuǎn)化為錯(cuò)誤,。這將迫使開(kāi)發(fā)人員修復(fù)代碼中的所有歧義,因?yàn)樗械木娑紝⒆鳛檎嬲膯?wèn)題處理,。
專用的靜態(tài)分析工具基于源代碼分析,,可以在不執(zhí)行程序的情況下發(fā)現(xiàn)潛在的問(wèn)題,比如 IAR 提供了與 IAR Embedded Workbench 無(wú)縫集成的靜態(tài)分析工具 C-STAT,。這種類型的工具可以幫助你找到代碼中最常見(jiàn)的缺陷來(lái)源,,也可以幫助你找到開(kāi)發(fā)人員在試圖編寫代碼時(shí)往往不會(huì)考慮的問(wèn)題,特別是當(dāng)他們?yōu)榱俗屇承┕δ苓\(yùn)行而加入支撐代碼時(shí),。靜態(tài)分析工具確實(shí)能幫助你開(kāi)發(fā)出更好的代碼,,因?yàn)樗鼈儚?qiáng)制執(zhí)行編碼標(biāo)準(zhǔn)。事實(shí)上,,如果正在創(chuàng)建一個(gè)功能安全認(rèn)證的應(yīng)用,,你可能會(huì)被建議,甚至強(qiáng)制要求使用靜態(tài)分析工具,。
此外,,嵌入式軟件在運(yùn)行時(shí)仍然容易受到算術(shù)問(wèn)題、緩沖區(qū)溢出,、邊界問(wèn)題,、堆完整性和內(nèi)存泄漏的影響。一個(gè)可行的方法是在可能發(fā)生潛在錯(cuò)誤的所有地方插入特定的檢測(cè)代碼或斷言來(lái)檢測(cè)此類錯(cuò)誤,。但是,,手動(dòng)添加指令來(lái)檢測(cè)并以某種方式在運(yùn)行時(shí)報(bào)告問(wèn)題是一項(xiàng)非常耗時(shí)的任務(wù)。因此,,使用動(dòng)態(tài)或運(yùn)行時(shí)分析工具來(lái)捕獲和觸發(fā)僅在運(yùn)行時(shí)的缺陷和錯(cuò)誤,,是一個(gè)可以極大提高效率和生產(chǎn)力的方法。例如,,在 IAR Embedded Workbench 中,,開(kāi)發(fā)人員可以使用運(yùn)行時(shí)分析工具插件 C-RUN,。
綜上所述,編譯器和鏈接器可以報(bào)告在構(gòu)建中可能出現(xiàn)的問(wèn)題,,靜態(tài)分析工具擅長(zhǎng)發(fā)現(xiàn)一些未定義行為的缺陷,,檢查編碼標(biāo)準(zhǔn)的符合性,而運(yùn)行時(shí)分析工具擅長(zhǎng)發(fā)現(xiàn)只有在執(zhí)行時(shí)才會(huì)觸發(fā)的缺陷,。這些缺陷有時(shí)會(huì)有重疊,,但有時(shí)只能在一個(gè)域或另一個(gè)域中檢測(cè)到。為了盡可能提高代碼質(zhì)量,,以及發(fā)現(xiàn)問(wèn)題的效率,,需要將幾者結(jié)合使用并盡可能與開(kāi)發(fā)和構(gòu)建工具集成。下圖矩陣代表組合不同工具時(shí)的完整缺陷覆蓋率,。
總結(jié)
隨著嵌入式系統(tǒng)的復(fù)雜性提高,,對(duì)于嵌入式軟件的要求也越來(lái)越高,其中最核心最根本的是代碼質(zhì)量,,而編碼標(biāo)準(zhǔn)是提高代碼質(zhì)量的最佳實(shí)踐,。遵循編碼標(biāo)準(zhǔn)的最有效的方式是應(yīng)用自動(dòng)化工具,包括靜態(tài)分析工具,,運(yùn)行時(shí)分析工具,,這樣可以有效地在開(kāi)發(fā)過(guò)程中提高代碼質(zhì)量,既減少了項(xiàng)目的開(kāi)發(fā)時(shí)間和成本,,又提高了產(chǎn)品的質(zhì)量和競(jìng)爭(zhēng)力,。
參考文獻(xiàn)
1.https://www.misra.org.uk/
2.https://ldra.com/ldra-blog/misra-myths-busted-1-is-misra-c-just-an-automotive-standard/
3.http://www.cert.org/
4.http://cwe.mitre.org/
5.https://www.iar.com/knowledge/learn/code-quality/everything-starts-with-code-quality/
6.https://www.iar.com/knowledge/learn/code-quality/everything-ends-with-code-quality/
更多精彩內(nèi)容歡迎點(diǎn)擊==>>電子技術(shù)應(yīng)用-AET<<