C 和 C++ 在某種程度上是嵌入式軟件開(kāi)發(fā)中使用最廣泛的語(yǔ)言。VDC 最近的研究表明,70% 的受訪嵌入式系統(tǒng)公司使用 C,42% 使用 C++。幾乎每個(gè)處理器都實(shí)現(xiàn)了 C。它提供了廣泛的資源和庫(kù),并得到了廣泛的工具的支持。
尤其是 C 語(yǔ)言,允許開(kāi)發(fā)人員做許多本質(zhì)上不正確的事情。編寫符合語(yǔ)言標(biāo)準(zhǔn)的代碼太容易了,但會(huì)導(dǎo)致程序失?。ū罎ⅲ┗蛭炊x的行為。常見(jiàn)的示例是導(dǎo)致訪問(wèn)數(shù)組邊界之外的內(nèi)存的代碼或?qū)е抡麛?shù)溢出的算術(shù)運(yùn)算。
編碼標(biāo)準(zhǔn)的哲學(xué)
業(yè)界接受的解決這些危害的方法是采用“編碼標(biāo)準(zhǔn)”。最簡(jiǎn)單的編碼標(biāo)準(zhǔn)定義了一組一致的編碼實(shí)踐。盡管風(fēng)格的統(tǒng)一性在軟件項(xiàng)目中可能很有價(jià)值,但它們并沒(méi)有解決軟件質(zhì)量的重要屬性,例如可靠性、可移植性或可維護(hù)性。編碼標(biāo)準(zhǔn)更基本的作用是通過(guò)制定一組規(guī)則來(lái)定義編程語(yǔ)言的更安全的子集,以消除已知危險(xiǎn)的編碼結(jié)構(gòu)。
體現(xiàn)這一安全子設(shè)置原則的汽車工業(yè)軟件可靠性協(xié)會(huì) (MISRA) 編碼指南現(xiàn)已在全球范圍內(nèi)被公認(rèn)為用 C 和 C++ 開(kāi)發(fā)安全關(guān)鍵型軟件的基準(zhǔn)。它們已被廣泛接受,因?yàn)樗鼈兒?jiǎn)潔易讀,并且專注于基本問(wèn)題。最近一項(xiàng)針對(duì) 500 名受訪者的民意調(diào)查 (Ganssle, 2014) 揭示了一些關(guān)于編碼標(biāo)準(zhǔn)采用率的有趣數(shù)據(jù)[1]。主要發(fā)現(xiàn)表明,在使用的所有編碼標(biāo)準(zhǔn)中,約有 60% 是基于 MISRA 的。采用的嚴(yán)格性是另一個(gè)有趣的發(fā)現(xiàn),基于 MISRA 的編碼規(guī)則集在開(kāi)發(fā)團(tuán)隊(duì)中實(shí)現(xiàn)了 75% 的一致性使用,而其他規(guī)則集的使用率不到 50%。
偏差原理
MISRA 編碼標(biāo)準(zhǔn)包含廣受推崇的 C 和 C++ 語(yǔ)言開(kāi)發(fā)指南。這些指南側(cè)重于開(kāi)發(fā)關(guān)鍵軟件系統(tǒng)時(shí)的重要問(wèn)題。MISRA 還認(rèn)識(shí)到,在某些情況下,遵守編碼指南是不合理甚至不可能的,并且有必要偏離某些規(guī)則。偏差說(shuō)明了在特定情況下不遵守特定編碼規(guī)則的原因。它還提供了放寬特定規(guī)則的程度的理由和描述,并提供了一個(gè)適當(dāng)構(gòu)建的安全案例,包括減輕不遵守的影響。
但是,如果沒(méi)有仔細(xì)說(shuō)明違規(guī)范圍,基本偏差工具可能會(huì)被誤解或?yàn)E用,并最終破壞指南的有效性。
限制偏差的使用
就像編碼標(biāo)準(zhǔn)本身需要客觀的創(chuàng)造和充分理解的理由一樣,偏離編碼規(guī)則的原因同樣需要一個(gè)共同的表達(dá)和商定的解釋以及它們的應(yīng)用范圍。汽車行業(yè)是 MISRA 最初且仍處于領(lǐng)先地位的應(yīng)用領(lǐng)域,它已面對(duì)這一要求。MISRA 本身和一個(gè)國(guó)家機(jī)構(gòu)日本汽車制造商協(xié)會(huì) (JAMA) 都已開(kāi)始制定允許特定偏離完全 MISRA 合規(guī)性的條件的過(guò)程。
這項(xiàng)工作的主旨是定義一組嚴(yán)格限制范圍的規(guī)則偏差。一個(gè)重要的第一階段是對(duì)偏離規(guī)則不合規(guī)的廣泛原因進(jìn)行分類。
分類偏差原因
通過(guò)將偏差分為以下幾類,合規(guī)的實(shí)際困難變得更加明顯。此外,這種分類可以防止不適當(dāng)?shù)钠詈途幋a標(biāo)準(zhǔn)意圖的弱化。
表現(xiàn)
建議將性能作為不遵循良好編碼實(shí)踐的原因似乎很奇怪且不直觀,但以下現(xiàn)實(shí)生活中的情況證明了這種需要:
作為車輛發(fā)動(dòng)機(jī)控制系統(tǒng)的一部分,需要定期累積正時(shí)變量。該代碼經(jīng)過(guò)正確制定以符合 MISRA-C:2012 規(guī)則 10.6(不應(yīng)分配給更廣泛類型的值),內(nèi)容如下:
extern uint16_t 數(shù)量,time_step;uint32_t prod = (uint32_t) 數(shù)量 * (uint32_t) time_step;
強(qiáng)制轉(zhuǎn)換確保 16 位操作數(shù)不會(huì)在此編譯器的 32 位乘法中溢出。但是,編譯器使用長(zhǎng)乘法的“移位和加法”模式而不是它配備的 IMUL(有符號(hào)乘法)模式來(lái)執(zhí)行此操作。編譯器供應(yīng)商已澄清 IMUL 模式僅發(fā)生在隱式轉(zhuǎn)換上,要求表達(dá)式讀?。?/p>
uint32_t 產(chǎn)品 = 數(shù)量 * 時(shí)間步長(zhǎng);// 偏離規(guī)則 10.6
通過(guò)在這種情況下允許隱式轉(zhuǎn)換,保證了單個(gè)時(shí)鐘周期的 IMUL 操作,而不是前者的約 100 個(gè)時(shí)鐘周期的最壞情況執(zhí)行,從而證明了基于性能的受控偏差是合理的。
外部(第三方)代碼
此類別包括通用庫(kù)、自動(dòng)生成的代碼和遺留的內(nèi)部代碼模塊,甚至只是包含關(guān)鍵應(yīng)用程序算法的復(fù)雜函數(shù)。公共領(lǐng)域庫(kù)的維護(hù)者,鑒于其廣泛的應(yīng)用領(lǐng)域,很少有動(dòng)力遵守 MISRA 或其他編碼標(biāo)準(zhǔn)。自動(dòng)生成的代碼,除非符合 ISO 26262 等功能安全標(biāo)準(zhǔn),否則可能包含固有的 MISRA 違規(guī)。遺留代碼可能早于項(xiàng)目采用 MISRA。為滿足 MISRA 規(guī)則而進(jìn)行的可能重構(gòu)的影響分析本身可能會(huì)引起關(guān)注。所有這些情況下的安全案例都是基于“使用合格”的依賴以及其他特定的質(zhì)量措施。
構(gòu)建配置
汽車供應(yīng)商應(yīng)用程序的一個(gè)特殊功能是根據(jù)客戶需要提供單個(gè)代碼庫(kù)的許多變體。不是對(duì)這種交付進(jìn)行構(gòu)建級(jí)控制,而是部署配置機(jī)制來(lái)控制每個(gè)變體的功能交付。因此,MISRA 合規(guī)性可能會(huì)在冗余代碼、表達(dá)式不變性和相關(guān)的全局問(wèn)題方面受到影響。
訪問(wèn)硬件
為了訪問(wèn)寄存器、尋址絕對(duì)內(nèi)存和控制中斷,嵌入式開(kāi)發(fā)人員需要訪問(wèn)特定于編譯器的 C 語(yǔ)言擴(kuò)展,從而導(dǎo)致不符合 MISRA。安全案例通常需要仔細(xì)的單元測(cè)試覆蓋。
防御性編碼
鑒于 C 語(yǔ)言中缺乏強(qiáng)大的異常處理功能,防御性編碼實(shí)踐可能涉及例如對(duì)不可預(yù)見(jiàn)行為的編程防護(hù)。一個(gè)功能齊全的分析工具將正確檢測(cè)不變的條件和無(wú)法訪問(wèn)的代碼。安全案例必須涉及這些路徑或條件的強(qiáng)制單元測(cè)試執(zhí)行。
語(yǔ)言特點(diǎn)
使用“最近的”語(yǔ)言結(jié)構(gòu)有有效的代碼質(zhì)量原因,例如布爾或“l(fā)ong long”類型或內(nèi)聯(lián)函數(shù)。但是,這些可能需要偏離舊版本的 MISRA。安全問(wèn)題是即使有 15 年歷史的 C99 結(jié)構(gòu)也不能保證得到所有編譯器的支持。
受控偏差的結(jié)構(gòu)
對(duì)不同的基本原理進(jìn)行分類是創(chuàng)建適當(dāng)約束的偏差結(jié)構(gòu)的第一步。這自然會(huì)導(dǎo)致按規(guī)則和類別詳細(xì)說(shuō)明所有特定的已知偏差案例。MISRA 和 JAMA 都在行業(yè)參與的情況下記錄了一組規(guī)則范圍限制,每個(gè)限制都有詳細(xì)的理由和安全案例。
即使在汽車領(lǐng)域之外,這些舉措也很重要。MISRA 編碼標(biāo)準(zhǔn)最初是為汽車行業(yè)設(shè)計(jì)的,但從早期開(kāi)始,它就被許多其他嵌入式環(huán)境所采用,從消費(fèi)產(chǎn)品到醫(yī)療設(shè)備,從工業(yè)控制到 EDA。同樣,對(duì)于任何采用編碼標(biāo)準(zhǔn)的人來(lái)說(shuō),建立一個(gè)受控偏差結(jié)構(gòu)都很重要。
自動(dòng)化工具支持
沒(méi)有自動(dòng)執(zhí)行手段和豐富的審計(jì)和報(bào)告能力的編碼標(biāo)準(zhǔn)將很快成為書柜的裝飾品,很少被引用或遵循。一個(gè)稱職的自動(dòng)化靜態(tài)分析工具的起點(diǎn)必須是其診斷輸出的準(zhǔn)確性、對(duì)所提出的每個(gè)問(wèn)題的清晰理解和解釋,以及針對(duì)軟件項(xiàng)目的每個(gè)版本的詳細(xì)報(bào)告。
但即使是自動(dòng)化工具執(zhí)行環(huán)境也需要了解和應(yīng)用已批準(zhǔn)的偏差政策,特別是因?yàn)檫@消除了完全合規(guī)的障礙。編碼規(guī)則和偏差策略都必須方便開(kāi)發(fā)人員、領(lǐng)導(dǎo)和經(jīng)理信任,并便于詳細(xì)的 QA 報(bào)告。
基本偏差系統(tǒng)會(huì)將規(guī)則抑制的每個(gè)實(shí)例與其支持偏差耦合,并在相關(guān)源代碼的生命周期內(nèi)保持這種耦合(圖 1)。在處理受控偏差時(shí),要求更加復(fù)雜。對(duì)相關(guān)編碼規(guī)則的任何壓制都必須遵守更嚴(yán)格的有效限制,并且在該受控偏差集之外不得進(jìn)行壓制。在選擇要抑制報(bào)告診斷的特定代碼位置時(shí),必須限制開(kāi)發(fā)人員僅使用允許的受控偏差范圍進(jìn)行抑制。
圖 1:受控偏差的工具執(zhí)行。

關(guān)鍵系統(tǒng)的安全代碼
MISRA C 編碼標(biāo)準(zhǔn)是在許多嵌入式環(huán)境及其他環(huán)境中安全和防御性使用 C 的代名詞。由于在 C 語(yǔ)言的限制使用方面既全面又廣泛,控制偏差的系統(tǒng)現(xiàn)在被認(rèn)為是必要的,正如各種行業(yè)和社區(qū)為指定這種縮減所做的努力所證明的那樣。現(xiàn)在正在為工業(yè)用途制定合理的具體偏差原因。對(duì)受控偏差計(jì)劃的復(fù)雜和自動(dòng)化工具支持以及報(bào)告和合規(guī)解決方案的其他元素今天可用。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5177文章
20002瀏覽量
325286 -
寄存器
+關(guān)注
關(guān)注
31文章
5503瀏覽量
128186 -
編譯器
+關(guān)注
關(guān)注
1文章
1665瀏覽量
50922
發(fā)布評(píng)論請(qǐng)先 登錄
IEEE802.3bt的合規(guī)性
軟件編程規(guī)范(MISRA-C)
汽車電子行業(yè)的MISRA C標(biāo)準(zhǔn)分享
MISRA合規(guī)性的五個(gè)實(shí)用技巧
MISRA C在安全可靠編程中的地位
Parasoft支持更新MISRA C:2012,提供最新的安全和合規(guī)編碼指南
如何將MISRA C:2023整合到您的嵌入式開(kāi)發(fā)流程中
汽車安全合規(guī)如何發(fā)揮作用
潤(rùn)和軟件聯(lián)合主辦openEuler & OpenHarmony 社區(qū)合規(guī)SIG開(kāi)源合規(guī)共建研討會(huì)
靜態(tài)代碼分析器工具Helix QAC 2023.2: 提供 100% 的 MISRA C:2012 和 MISRA C:2023 規(guī)則覆蓋率

在MISRA合規(guī)環(huán)境中控制汽車軟件偏差
評(píng)論