MISRA C++:2023,您需要了解的下一個(gè) MISRA 信息
發(fā)布時(shí)間:2023-10-16 15:41:24
MISRA C++ ?的背景
MISRA C++的當(dāng)前版本發(fā)布于 2008 年。它為以 ISO C++ 2003 編寫的安全相關(guān)軟件的開發(fā)提供了專家指導(dǎo)。這套指南已經(jīng)被廣泛采用,并在許多安全關(guān)鍵項(xiàng)目中成為了強(qiáng)制遵循的準(zhǔn)。然而,自那時(shí)以來,C++語(yǔ)言發(fā)生了相當(dāng)大的變化,新的版本引入了新的語(yǔ)言功能,并且改變了現(xiàn)有的特性。
使用較新版本的 C++語(yǔ)言開發(fā)的項(xiàng)目可能不符合 MISRA C++:2008 的所有規(guī)則,并且新特性可能不在其覆蓋范圍之內(nèi)。為了給這些新版本提供指南,AUTOSAR 以 MISRA C++:2008 為基礎(chǔ),結(jié)合其他標(biāo)準(zhǔn)的規(guī)則,為 C++14 制定了新的指南。MISRA C++工作組目前正在根據(jù) AUTOSAR 指南對(duì) MISRA C++進(jìn)行更新,以適用于 C++17,但其中包括了 MISRA 已確立的安全相關(guān) C++開發(fā)的最佳實(shí)踐。
人們對(duì)新的 MISRA C++指南興趣濃厚。然而,由于 MISRA C++:2008 已被許多項(xiàng)目采用,所以對(duì)于改用新的指南,人們也存在一些擔(dān)憂。
MISRA C++:2023?系列文章預(yù)覽
在本系列文章中,將探討新標(biāo)準(zhǔn)的多個(gè)方面。
C++和 MISRA C++的歷史
首先,文章將概述 C++編程語(yǔ)言的歷史,從 1979 年 Bjarne Stroustrup 在貝爾實(shí)驗(yàn)室提出概念,到 1991 年開始標(biāo)準(zhǔn)化,再到目前的 C++20 版本。
值得注意的是,C++20 中添加的一些主要功能在之前就已經(jīng)討論過了。“模塊(modules)”和“概念(concepts)”就是這種情況,它們都是新功能,為并發(fā)編程的標(biāo)準(zhǔn)化功能提供庫(kù)實(shí)現(xiàn)(library implementations)和協(xié)程(coroutines)。直到現(xiàn)在,并發(fā)支持才成為指南的一部分。但在之前,這些功能已經(jīng)在 Simula 編程語(yǔ)言中存在,與 C 語(yǔ)言的高效性能相結(jié)合,以提供程序組織和并發(fā)支持。
然而,必須指出,MISRA C++似乎將以 C++17 為基礎(chǔ)。造成這種情況的原因可能是,編譯器實(shí)現(xiàn)者需要時(shí)間來為所有語(yǔ)言特性提供支持,而且這些實(shí)現(xiàn)還需要經(jīng)過認(rèn)證才能用于安全關(guān)鍵項(xiàng)目。
隨著時(shí)間的推移,已經(jīng)有許多不同的 C++編碼標(biāo)準(zhǔn)被編寫出來了。不僅是前文提到的 AUTOSAR 指南,還有許多其他流行的編碼標(biāo)準(zhǔn)在使用中。在今年的《汽車軟件開發(fā)狀況報(bào)告》中,介紹了 400 位汽車開發(fā)專業(yè)人士對(duì)于汽車軟件行業(yè)當(dāng)前實(shí)踐和新興趨勢(shì)的問題的回答。隨著電動(dòng)汽車和半自動(dòng)駕駛汽車的持續(xù)發(fā)展,以及隨之而來的軟件組件的增加,研究結(jié)果繼續(xù)表明,安全性與防范性同樣重要,并且是人們關(guān)注的主要問題。遵守安全標(biāo)準(zhǔn)的要求越來越高,也反映了這一點(diǎn)。
該報(bào)告還顯示,仍然是汽車行業(yè)最流行的編碼標(biāo)準(zhǔn),42%的受訪者使用 MISRA 編碼標(biāo)準(zhǔn)。鑒于 MISRA 的悠久歷史及其在汽車行業(yè)的深厚根基,這就不足為奇了。AUTOSAR 以 36%的比例位居第三。C++核心指南標(biāo)準(zhǔn)令人驚訝地排在第二位,占比 39%,盡管該標(biāo)準(zhǔn)與汽車行業(yè)沒有明顯的關(guān)系。它之所以受歡迎,可能是因?yàn)樗w了開發(fā)人員想要使用的最新 C++語(yǔ)言特性。
您目前正在使用哪些編碼標(biāo)準(zhǔn)?
△《2023 年汽車軟件開發(fā)狀況報(bào)告》對(duì)于此問題的回應(yīng)
C++編碼標(biāo)準(zhǔn)的方方面面
由 Bjarne Stroustrup 和 Herb Sutter 發(fā)起的 C++核心指南是一份不斷改進(jìn)的動(dòng)態(tài)文件。由于該標(biāo)準(zhǔn)涵蓋了最新的 C++語(yǔ)言功能,所以也影響著 AUTOSAR 標(biāo)準(zhǔn)的制定。AUTOSAR 包括了兩個(gè)標(biāo)準(zhǔn)之間的比較,顯示 C++核心準(zhǔn)則中有 30%與 AUTOSAR 規(guī)則存在沖突。MISRA C++:2023 涵蓋了大部分 AUTOSAR 的問題,并且新的指南沒有直接使用 C++核心準(zhǔn)則。
Perforce 將提供一篇專門的文章,全方位比較這些 C++編碼標(biāo)準(zhǔn),包括理念、指南、執(zhí)行和聲明合規(guī)性。由于 MISRA C++:2023 似乎不太可能整合所有的 AUTOSAR 規(guī)則,所以 Perforce 將評(píng)估與新 MISRA C++:2023 規(guī)則中與 C++核心指南沖突的比例,并將其與 AUTOSAR 進(jìn)行比較。
MISRA C++:2023 的新準(zhǔn)則
最后,還將有一些介紹新準(zhǔn)則的文章。
MISRA C++:2023 將提供定義類類型接口的指導(dǎo)規(guī)則。它提倡“規(guī)則 0(Rule of Zero)”,這意味著它更傾向于不指定特殊成員函數(shù),因?yàn)檎Z(yǔ)言標(biāo)準(zhǔn)保證了編譯器已經(jīng)提供了預(yù)期的實(shí)現(xiàn)。
這與其他建議如“規(guī)則 5”(或“規(guī)則 6”,如果您還單獨(dú)計(jì)算默認(rèn)構(gòu)造函數(shù)的話)相矛盾,后者規(guī)定您需要始終明確指定特殊成員函數(shù)。Perforce 將討論新規(guī)則如何處理現(xiàn)有指南所涵蓋的漏洞。
不過,這也存在風(fēng)險(xiǎn),從為 AUTOSAR 規(guī)則 A12-0-1 提供的合規(guī)示例中就可以看出:
class A // Compliant - the class A follow the "Rule of six" rule
{
public:
A(); // Non-default constructor
~A() = default;
A(A const&) = default;
A& operator=(A const&) = default;
A(A&&) = delete;
A& operator=(A&&) = delete;
};
復(fù)制代碼
可以看到,只有移動(dòng)函數(shù)(move functions)被刪除了,而復(fù)制函數(shù)和析構(gòu)函數(shù)被設(shè)置為默認(rèn)。這樣的代碼可能是開發(fā)人員遵循“規(guī)則 3”到“規(guī)則 5”的代碼進(jìn)行擴(kuò)展的結(jié)果,但開發(fā)人員試圖通過刪除新的移動(dòng)函數(shù)來保留舊的行為。MISRA C++不允許這種特殊成員函數(shù)的組合;如果一個(gè)類提供了復(fù)制函數(shù),那它必須同時(shí)提供移動(dòng)函數(shù)。這個(gè)類的問題在于,它不能與容器一起使用。例如,當(dāng)嘗試聲明一個(gè)該類型的向量時(shí),由于缺少移動(dòng)函數(shù),會(huì)發(fā)生編譯錯(cuò)誤。需要注意的是,這個(gè)示例在 AUTOSAR 標(biāo)準(zhǔn)的 18-03 版本中得到了修正,規(guī)則的措辭也發(fā)生了變化,但并沒有明確要求在提供復(fù)制函數(shù)時(shí)必須提供移動(dòng)函數(shù)。
MISRA C++:2023 將包括限制使用標(biāo)準(zhǔn)類型轉(zhuǎn)換的指南。熟悉 MISRA C:2012 的開發(fā)人員可能期望有類似的類型轉(zhuǎn)換規(guī)則,就像 MISRA C 基本類型定義的規(guī)則一樣,但情況并非如此。
MISRA C++:2023 要嚴(yán)格得多。原因是:與 C 不同,C++提供了函數(shù)重載,這取決于表達(dá)式的確切類型和自動(dòng)占位符類型說明符,其中類型是從表達(dá)式派生的。如果不遵守規(guī)則,可能會(huì)出現(xiàn)這樣的情況:包含頭文件的函數(shù)重載比之前的函數(shù)重載匹配得更好,這可能是意料之外的。有一種安全的方法可以避免隱式轉(zhuǎn)換,那就是使用具有整數(shù)基礎(chǔ)類型的類型安全枚舉類型。這種強(qiáng)類型的值不會(huì)被隱式轉(zhuǎn)換。
使用 Helix QAC,確保 MISRA 合規(guī)性
Perforce 的Helix QAC是一款靜態(tài)分析工具,在提供 MISRA C 和 MISRA C++合規(guī)性檢查以及許多其他有價(jià)值的分析功能方面處于領(lǐng)先地位。
Helix QAC 提供了合規(guī)模塊,用于強(qiáng)制執(zhí)行 MISRA C 和 MISRA C++的所有版本和修訂,包括 MISRA C:2023。Perforce 計(jì)劃在標(biāo)準(zhǔn)發(fā)布時(shí),提供完整的 MISRA C++:2023 合規(guī)性模塊。