0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

安全編碼技術(shù):提高嵌入式應(yīng)用代碼安全性與可靠性

馬華1 ? 來(lái)源:IAR ? 作者:IAR ? 2024-08-27 15:01 ? 次閱讀

作者:IAR

編程語(yǔ)言的現(xiàn)代化和更好的編碼技術(shù)與從機(jī)械計(jì)算機(jī)到現(xiàn)代軟件開(kāi)發(fā)流程的演變直接相關(guān)。我們已經(jīng)從高度專業(yè)化、主要是數(shù)學(xué)符號(hào)的表示法過(guò)渡到了更接近人類語(yǔ)法的高級(jí)編程語(yǔ)言,這一進(jìn)步歸功于編譯器技術(shù)。然而,這也打開(kāi)了代碼缺陷之門(mén)。 C和C++ 等高級(jí)編程語(yǔ)言,包含大量未定義的行為,而不同的編譯器對(duì)這些行為的解釋可能略有不同,這可能會(huì)導(dǎo)致未知或不希望出現(xiàn)的副作用,最終轉(zhuǎn)化為缺陷。

查找和修復(fù)這些缺陷可能會(huì)占用高達(dá)80%的開(kāi)發(fā)時(shí)間,具體取決于開(kāi)發(fā)機(jī)構(gòu)的成熟程度。這引出了一個(gè)明顯的結(jié)論:代碼質(zhì)量是一個(gè)大問(wèn)題。那么,為什么不盡量避免缺陷,以減少調(diào)試所需的時(shí)間呢?

順便說(shuō)一句,我們現(xiàn)在仍然在軟件中使用“錯(cuò)誤”和“調(diào)試”這些概念,但這些詞的起源可以追溯到哈佛大學(xué)的機(jī)械計(jì)算機(jī)。當(dāng)時(shí),一只飛蛾卡在繼電器中,這一事件被記錄為計(jì)算機(jī)歷史上第一個(gè)“錯(cuò)誤”或缺陷。

一次又一次重復(fù)同樣的錯(cuò)誤

眾所周知,在Web、應(yīng)用程序、桌面,甚至嵌入式開(kāi)發(fā)中,開(kāi)發(fā)人員往往會(huì)無(wú)意間一次又一次地在他們的源代碼中引入相同類型的錯(cuò)誤。這個(gè)結(jié)論來(lái)自于多個(gè)重要機(jī)構(gòu),如NASA、貝爾實(shí)驗(yàn)室和MITRE,他們進(jìn)行了多項(xiàng)調(diào)查和研究。常見(jiàn)缺陷的例子包括在C++代碼(甚至C代碼)中沒(méi)有進(jìn)行分配后的釋放,以及使用沒(méi)有原型的函數(shù),因此無(wú)法在編譯時(shí)進(jìn)行嚴(yán)格的類型檢查。這項(xiàng)研究的結(jié)果列出了最佳編程實(shí)踐或推薦的編程實(shí)踐,它們可以識(shí)別有風(fēng)險(xiǎn)的和不良的編碼行為。

有許多關(guān)于如何提高代碼質(zhì)量的指南和編碼實(shí)踐,它們都基于常見(jiàn)的錯(cuò)誤,并指出了如何在將來(lái)避免這些常見(jiàn)錯(cuò)誤。其中一些技巧和實(shí)踐已經(jīng)成為被廣泛接受的標(biāo)準(zhǔn)(比如MISRA-C和CERT-C),特別是在汽車、醫(yī)療和鐵路等關(guān)鍵行業(yè)中,以確保應(yīng)用程序的代碼安全性(code safety)和代碼防護(hù)能力(code security)。諸如IEC 61508、EN 50128和ISO 26262等功能安全標(biāo)準(zhǔn)建議[或強(qiáng)烈建議,具體取決于安全完整性等級(jí)(SIL)或汽車安全完整性等級(jí)(ASIL)]使用靜態(tài)和運(yùn)行時(shí)分析工具,以滿足標(biāo)準(zhǔn)。因?yàn)榘踩P(guān)鍵系統(tǒng)中的缺陷可能會(huì)導(dǎo)致嚴(yán)重后果,如人員傷亡或環(huán)境破壞。

關(guān)注可靠性

安全編碼技術(shù)要綜合考慮代碼質(zhì)量、代碼安全性和代碼防護(hù)能力。代碼安全性關(guān)注的是軟件的可靠性,而代碼防護(hù)能力則旨在防止不必要的活動(dòng),并且在遭受攻擊時(shí)確保系統(tǒng)安全。這兩者都高度依賴于代碼質(zhì)量,因?yàn)榇a質(zhì)量是每個(gè)可靠應(yīng)用程序的基礎(chǔ)。

安全編碼技術(shù)和標(biāo)準(zhǔn)的目標(biāo)是推動(dòng)軟件的安全性,以確保所需的可靠性。然而,同樣重要的是提高源代碼的可讀性和可維護(hù)性。更高效、更易讀的代碼意味著源代碼更加健壯、缺陷更少且在未來(lái)可用,有助于提高代碼的可重用性。

MISRA C是最成熟的軟件開(kāi)發(fā)標(biāo)準(zhǔn)之一,可以避免常見(jiàn)的缺陷和漏洞。當(dāng)然,還有一些其他指南,如CWE和CERT-C編碼標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)對(duì)于任何嵌入式應(yīng)用程序都是強(qiáng)烈推薦的。下面讓我們更深入地了解這些編碼標(biāo)準(zhǔn)。

MISRA C標(biāo)準(zhǔn)

MISRA C由汽車行業(yè)軟件可靠性協(xié)會(huì)(Motor Industry Software Reliability Association)開(kāi)發(fā),它的目標(biāo)是提高嵌入式系統(tǒng)中代碼的安全性、可移植性和可靠性,尤其是那些使用ISO C編程的系統(tǒng)。

MISRA C標(biāo)準(zhǔn)的第一版名為《車載軟件C語(yǔ)言開(kāi)發(fā)指南》,于1998年發(fā)布,正式名稱為MISRA-C:1998。之后于2004年和2012年進(jìn)行了更新,添加了更多的規(guī)則。另外,還有基于C++ 2003的MISRA C++ 2008標(biāo)準(zhǔn)。此后,MISRA C: 2012的修正案1又添加了14條附加規(guī)則,重點(diǎn)關(guān)注ISO C安全指南(Secure Guidelines)中強(qiáng)調(diào)的安全問(wèn)題(security concerns)。其中一些規(guī)則解決了在許多嵌入式應(yīng)用程序中已知的安全漏洞之一:與使用不可信數(shù)據(jù)相關(guān)的特定問(wèn)題。

MISRA規(guī)則可以幫助您在提交代碼進(jìn)行正式構(gòu)建之前發(fā)現(xiàn)問(wèn)題,因此通過(guò)這種方式發(fā)現(xiàn)的缺陷就好像缺陷從未存在過(guò)一樣。MISRA規(guī)則的設(shè)計(jì)是以安全性和可靠性為前提的,同時(shí)也讓代碼更容易移植到其他工具和架構(gòu)上。

CWE and CERT C/C++

CWE,即通用缺陷列表(Common Weakness Enumeration),是一個(gè)由社區(qū)開(kāi)發(fā)的有關(guān)軟件缺陷的詞典。CWE提供了一套統(tǒng)一的、可衡量的軟件缺陷,以便更好地理解和管理它們,并且可以支持能夠發(fā)現(xiàn)它們的高效軟件安全工具和服務(wù)。

CERT C/C++安全編碼標(biāo)準(zhǔn)(Secure Coding Standards)是由計(jì)算機(jī)緊急響應(yīng)小組(Computer Emergency Response Team,CERT)發(fā)布的標(biāo)準(zhǔn),提供了有關(guān)C/C++編程語(yǔ)言中安全編碼(secure coding)的規(guī)則和建議。

實(shí)施安全編碼技術(shù)

作為通常性的建議,每個(gè)嵌入式應(yīng)用程序至少都應(yīng)遵循MISRA(對(duì)于安全關(guān)鍵系統(tǒng),MISRA 是強(qiáng)制性的)、CWE和CERT C/C++標(biāo)準(zhǔn)。

遵循這些編碼標(biāo)準(zhǔn)之后,在運(yùn)行時(shí),您的應(yīng)用程序仍然可能會(huì)受到算術(shù)問(wèn)題、緩沖區(qū)溢出、邊界問(wèn)題、堆完整性和內(nèi)存泄漏等問(wèn)題的影響。要檢測(cè)到這些錯(cuò)誤,可以在可能發(fā)生潛在錯(cuò)誤的所有位置插入特定的檢測(cè)代碼或斷言。然而,手動(dòng)添加指令來(lái)檢查并在運(yùn)行時(shí)報(bào)告問(wèn)題是一項(xiàng)非常耗時(shí)的任務(wù)。

要遵守所有這些指南和標(biāo)準(zhǔn),您需要遵循近700條規(guī)則和要求,同時(shí)還需要在源代碼中添加檢測(cè)代碼。那么,如何實(shí)施安全編碼技術(shù)并遵循所有這些規(guī)則呢?

使用自動(dòng)化工具

提高軟件質(zhì)量、安全性和可靠性的最佳方法是使用自動(dòng)化工具。這可以通過(guò)使用高質(zhì)量的編譯器和鏈接器(最好是經(jīng)過(guò)功能安全認(rèn)證的編譯器和鏈接器),以及自動(dòng)化的靜態(tài)分析和運(yùn)行時(shí)分析工具來(lái)實(shí)現(xiàn)。

IAR作為全球領(lǐng)先的嵌入式系統(tǒng)開(kāi)發(fā)軟件解決方案供應(yīng)商,所提供的集成開(kāi)發(fā)環(huán)境IAR Embedded Workbench就包括了編譯器、匯編器、鏈接器和調(diào)試器,并無(wú)縫集成了靜態(tài)分析工具 C-STAT和運(yùn)行時(shí)分析工具C-RUN,形成了完整的工具鏈。憑借這些強(qiáng)大的功能,IAR Embedded Workbench可以確保代碼的穩(wěn)健性、安全性和高質(zhì)量。

我們先來(lái)看看編譯器和鏈接器,它們應(yīng)該支持現(xiàn)代編程語(yǔ)言,比如最新的C(ISO/IEC 9899:2018)和C++(ISO/IEC 14882:2020,也稱為C++20修訂版),這樣它們就會(huì)在出現(xiàn)可疑情況或語(yǔ)法問(wèn)題時(shí)生成警告,例如,易失性內(nèi)存訪問(wèn),其求值順序可能會(huì)影響應(yīng)用程序的邏輯。

編譯器和鏈接器警告(warnings)是您的第一步靜態(tài)分析檢查,絕不能忽視,特別是在功能安全環(huán)境中。最佳建議是通過(guò)更改編譯器設(shè)置將所有警告視為錯(cuò)誤,這樣就可以將這些警告轉(zhuǎn)換為錯(cuò)誤。這將讓開(kāi)發(fā)人員修復(fù)代碼中的所有不明確之處,因?yàn)樗袉?wèn)題都將被視為真正的問(wèn)題。

靜態(tài)分析工具可以幫助您發(fā)現(xiàn)代碼中最常見(jiàn)的缺陷,同時(shí)還可以幫助您找出開(kāi)發(fā)人員在嘗試編寫(xiě)代碼時(shí)通常不會(huì)考慮或擔(dān)心的問(wèn)題,尤其是當(dāng)他們只是編寫(xiě)腳手架代碼以使某些功能正常運(yùn)行時(shí)。這種類型的工具確實(shí)可以幫助您開(kāi)發(fā)更高質(zhì)量的代碼,因?yàn)樗鼈兛梢詭椭鷮?shí)施編碼標(biāo)準(zhǔn)。IAR的C-STAT靜態(tài)分析工具無(wú)需任何安裝和靜態(tài)代碼分析工程創(chuàng)建,只需要進(jìn)行簡(jiǎn)單的規(guī)則設(shè)置,就可以在構(gòu)建(Build)成功之后進(jìn)行靜態(tài)代碼分析,非常適合開(kāi)發(fā)人員在日常開(kāi)發(fā)過(guò)程中使用。

此外,還有動(dòng)態(tài)或運(yùn)行時(shí)分析工具,可以捕獲僅在運(yùn)行時(shí)出現(xiàn)的代碼缺陷。動(dòng)態(tài)或運(yùn)行時(shí)分析工具可以在于軟件調(diào)試器中執(zhí)行程序時(shí)發(fā)現(xiàn)代碼中的實(shí)際和潛在錯(cuò)誤。IAR的C-RUN動(dòng)態(tài)分析工具通過(guò)簡(jiǎn)單的配置、重新編譯、運(yùn)行,即可實(shí)現(xiàn)算術(shù)檢查、邊界檢查和堆檢查。使用C-RUN無(wú)需對(duì)現(xiàn)有流程做任何修改,可作為日常開(kāi)發(fā)工作流程的自然組成部分,這極大地降低了動(dòng)態(tài)分析工具的使用門(mén)檻。

當(dāng)您查看系統(tǒng)中可能存在的所有缺陷時(shí),靜態(tài)分析工具擅長(zhǎng)找到某些類型的缺陷,而運(yùn)行時(shí)分析工具則擅長(zhǎng)找到其他類型的缺陷。有時(shí)它們可能會(huì)有重疊,但有時(shí)只有一種工具才能檢測(cè)到某個(gè)缺陷。要獲得最全面的代碼分析,最好將這兩種工具結(jié)合使用,并將它們與頂尖的構(gòu)建工具集成在一起。下圖的矩陣很好地展示了在結(jié)合不同工具進(jìn)行檢測(cè)時(shí)完整的缺陷覆蓋范圍。

wKgZombNeZ6AM0yGAACd3-S0bYI342.png

總結(jié)

隨著嵌入式系統(tǒng)的復(fù)雜性提高,對(duì)于嵌入式軟件的要求也越來(lái)越高,其中最核心最根本的是代碼質(zhì)量,而遵循編碼標(biāo)準(zhǔn)的安全編碼技術(shù)是提高代碼質(zhì)量的最佳實(shí)踐。實(shí)施安全編碼技術(shù)最有效的方式是應(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)力。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5087

    文章

    19153

    瀏覽量

    306418
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    354

    瀏覽量

    36728
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    951

    瀏覽量

    54883
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何提高嵌入式代碼質(zhì)量?

    的問(wèn)題。 結(jié)語(yǔ) 提高嵌入式代碼質(zhì)量不僅僅是技術(shù)挑戰(zhàn),更是對(duì)開(kāi)發(fā)團(tuán)隊(duì)和開(kāi)發(fā)流程的全面考驗(yàn)。通過(guò)遵循良好的軟件工程實(shí)踐、優(yōu)化性能和資源利用率、強(qiáng)調(diào)
    發(fā)表于 01-15 10:48

    電池的安全性測(cè)試項(xiàng)目有哪些?

    選擇更加安全可靠的電池產(chǎn)品,也能提高對(duì)電池安全性的信任。在電池技術(shù)日益進(jìn)步的今天,安全性測(cè)試仍將是確保電池產(chǎn)品質(zhì)量和用戶
    的頭像 發(fā)表于 12-06 09:55 ?524次閱讀
    電池的<b class='flag-5'>安全性</b>測(cè)試項(xiàng)目有哪些?

    實(shí)時(shí)操作系統(tǒng)可增強(qiáng)安全性可靠性

    世界衛(wèi)生組織(WHO)《2023年全球道路安全狀況報(bào)告》顯示,全球每年約有120萬(wàn)人因道路交通事故失去生命。這一驚人的數(shù)據(jù)背后,凸顯了對(duì)安全性可靠性的極高需求。特別是在自動(dòng)駕駛技術(shù)
    的頭像 發(fā)表于 12-04 13:51 ?459次閱讀

    在電氣安裝中通過(guò)負(fù)載箱實(shí)現(xiàn)最大效率和安全性

    在電氣安裝中,負(fù)載箱是一種常用的設(shè)備,主要用于模擬實(shí)際的電力負(fù)載,以便進(jìn)行各種電氣設(shè)備的測(cè)試和調(diào)試。通過(guò)負(fù)載箱,可以實(shí)現(xiàn)最大效率和安全性,從而提高電氣設(shè)備的運(yùn)行性能和使用壽命。 負(fù)載箱可以實(shí)現(xiàn)最大
    發(fā)表于 11-20 15:24

    智能系統(tǒng)的安全性分析

    )和非對(duì)稱加密(如RSA)等技術(shù),確保數(shù)據(jù)在存儲(chǔ)和傳輸過(guò)程中的機(jī)密。 加密算法應(yīng)經(jīng)過(guò)廣泛驗(yàn)證和測(cè)試,以確保其安全性可靠性。 數(shù)據(jù)完整
    的頭像 發(fā)表于 10-29 09:56 ?295次閱讀

    UPS電源的安全性可靠性分析

    隨著信息技術(shù)的飛速發(fā)展,數(shù)據(jù)和信息已成為現(xiàn)代社會(huì)的重要資產(chǎn)。因此,確保數(shù)據(jù)的持續(xù)可用和完整變得至關(guān)重要。不間斷電源(UPS)系統(tǒng)作為保護(hù)關(guān)鍵設(shè)備免受電力中斷影響的重要手段,其安全性
    的頭像 發(fā)表于 10-28 10:49 ?553次閱讀

    【「嵌入式Hypervisor:架構(gòu)、原理與應(yīng)用」閱讀體驗(yàn)】+全文學(xué)習(xí)心得

    降低了虛擬機(jī)之間的耦合提高了系統(tǒng)的可靠性安全性。 在學(xué)習(xí)過(guò)程中,我深刻體會(huì)到嵌入式Hypervisor的核心價(jià)值在于其靈活性和可擴(kuò)展性
    發(fā)表于 10-09 19:11

    【「嵌入式Hypervisor:架構(gòu)、原理與應(yīng)用」閱讀體驗(yàn)】+第7-8章學(xué)習(xí)心得

    Hypervisor在實(shí)際應(yīng)用中的重要。在航空領(lǐng)域,嵌入式Hypervisor已成為綜合模塊化航空電子設(shè)備(IMA)架構(gòu)的標(biāo)準(zhǔn)應(yīng)用接口,為飛行控制系統(tǒng)提供了高可靠性安全性的保障。在
    發(fā)表于 10-09 18:50

    嵌入式系統(tǒng)中工業(yè)4.0網(wǎng)絡(luò)安全

    斷改進(jìn)編碼標(biāo)準(zhǔn)就是為了幫助提高軟件的安全性、可移植可靠性和可維護(hù)的水平。靜態(tài)分析除了在源
    的頭像 發(fā)表于 08-12 21:45 ?496次閱讀
    <b class='flag-5'>嵌入式</b>系統(tǒng)中工業(yè)4.0網(wǎng)絡(luò)<b class='flag-5'>安全</b>

    如何確保設(shè)備在高溫環(huán)境下的可靠性安全性

    隨著夏季的到來(lái),高溫天氣對(duì)工業(yè)設(shè)施和設(shè)備的正常運(yùn)行構(gòu)成了挑戰(zhàn)。這個(gè)夏季,高溫不斷,降水不停,更是為維保增加了難度。為了確保設(shè)備在高溫環(huán)境下的可靠性安全性,我們需要更好的巡檢、監(jiān)測(cè)產(chǎn)品。
    的頭像 發(fā)表于 08-09 15:39 ?559次閱讀

    請(qǐng)問(wèn)DM平臺(tái)訪問(wèn)安全性如何控制?

    DM平臺(tái)訪問(wèn)安全性如何控制?
    發(fā)表于 07-25 06:10

    汽車功能安全可靠性的關(guān)系

    當(dāng)前,隨著汽車領(lǐng)域的飛速發(fā)展,汽車也被重新定義。在汽車電子電氣系統(tǒng)設(shè)計(jì)時(shí),離不開(kāi)對(duì)功能安全可靠性設(shè)計(jì)的考慮。正確理解兩者之間的關(guān)系,有助于更好地分析問(wèn)題和解決問(wèn)題。什么是汽車可靠性汽車可靠性
    的頭像 發(fā)表于 07-13 08:28 ?3247次閱讀
    汽車功能<b class='flag-5'>安全</b>與<b class='flag-5'>可靠性</b>的關(guān)系

    FMEA與機(jī)器人:如何確保機(jī)器人技術(shù)可靠性安全性

    隨著科技的飛速發(fā)展,機(jī)器人技術(shù)已經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域,從工業(yè)生產(chǎn)到醫(yī)療服務(wù),再到家庭生活,機(jī)器人的身影無(wú)處不在。然而,隨著機(jī)器人的普及,其潛在的風(fēng)險(xiǎn)和故障也逐漸顯現(xiàn)。為了確保機(jī)器人技術(shù)可靠性
    的頭像 發(fā)表于 04-12 10:07 ?579次閱讀

    多業(yè)務(wù)光端機(jī)安全性解析:保障數(shù)據(jù)傳輸?shù)?b class='flag-5'>可靠性與保密

    隨著信息技術(shù)的飛速發(fā)展,數(shù)據(jù)的安全性和保密已成為各行各業(yè)關(guān)注的焦點(diǎn)。多業(yè)務(wù)光端機(jī)作為一種高速、高效的光通信設(shè)備,在保障數(shù)據(jù)傳輸?shù)?b class='flag-5'>可靠性與保密
    的頭像 發(fā)表于 02-23 13:58 ?491次閱讀

    如何提高分布式大屏控制系統(tǒng)的穩(wěn)定性和可靠性

    模塊,降低單點(diǎn)故障對(duì)整體的影響。同時(shí),合理規(guī)劃系統(tǒng)資源的部署和冗余配置,以提高系統(tǒng)的可靠性和穩(wěn)定性。 數(shù)據(jù)冗余備份:為確保數(shù)據(jù)的安全性,應(yīng)采用數(shù)據(jù)冗余備份策略。通過(guò)將數(shù)據(jù)存儲(chǔ)到多個(gè)存儲(chǔ)設(shè)備上,即使某個(gè)節(jié)點(diǎn)發(fā)
    的頭像 發(fā)表于 01-29 14:39 ?451次閱讀