MISRA C++:2023?是廣受期待的MISRA C++ ?標準的下一個版本,將于今年晚些時候發(fā)布。新版本將整合AUTOSAR C++14指南,并支持C++的最新版本。
MISRA?是由汽車行業(yè)軟件可靠性協(xié)會(MISRA)開發(fā)的一套C和C++編碼標準,不僅是汽車行業(yè)的最佳標準之一,也是任何使用嵌入式系統(tǒng)的行業(yè)的最佳標準之一。
為了幫助您為即將發(fā)布的版本做好準備,我們推出了一個由我們的MISRA專家Frank van den Beuken博士撰寫的關(guān)于MISRA C++:2023概述的博客系列。
1??MISRA C++ ?背景
MISRA C++于2008年發(fā)布。它為ISO C++2003編寫的安全相關(guān)軟件的開發(fā)提供了專家指導。這套指南已被廣泛采用,合規(guī)性已成為許多安全關(guān)鍵項目的強制性要求。然而,從那時起,C++語言發(fā)生了很大變化,新版本引入了新的語言功能并改變了現(xiàn)有的功能。
使用較新C++語言版本的項目可能不符合MISRA C++ 2008的所有規(guī)則。為了為這些后續(xù)版本提供指南,AUTOSAR為C++14開發(fā)了新的指南,該指南基于MISRA C++:2008,但通過其他標準的規(guī)則進行了增強。
MISRA C++工作組目前正在根據(jù)AUTOSAR指南對MISRA C++進行更新,該適用于C++17,但包括MISRA在安全相關(guān)C++開發(fā)方面的既定最佳實踐。預(yù)計更新后的標準將于今年晚些時候發(fā)布。
人們對新的MISRA C++指南非常感興趣。然而,由于MISRA C++:2008已被許多項目采用,此對改用新指南的影響存在一些擔憂。
2??MISRA C++:2023?博客系列預(yù)覽
在本博客系列中,我們將討論新標準的多個方面。
??C++和MISRA C++的歷史
我們將從C++編程語言的歷史概述開始,從1979年貝爾實驗室的Bjarne Stroustrup提出的C++編程語言概念,到1991年開始標準化,再到目前的C++20版本。
值得注意的是,C++20中添加的一些主要功能在很久以前就已經(jīng)討論過了。模塊和概念就是這種情況,它們是為并發(fā)編程的標準化特性提供庫實現(xiàn)和協(xié)同程序的新穎特性。直到現(xiàn)在,并發(fā)支持才成為標準的一部分,盡管這些是與程序組織一起與C的效率相結(jié)合的Simula編程語言功能。
然而,必須指出的是,MISRA C++仍然基于C++17。主要原因是編譯器的實現(xiàn)程序需要時間來為所有語言功能提供支持,然后此類實現(xiàn)也需要經(jīng)過認證才能用于安全關(guān)鍵項目。
隨著時間的推移,已經(jīng)編寫了許多不同的C++編碼標準。我們已經(jīng)提到了AUTOSAR指南,但也有許多其他流行的編碼標準在使用中。今年的《汽車軟件開發(fā)狀況報告 》介紹了400名汽車開發(fā)專業(yè)人士對汽車軟件行業(yè)當前實踐和新興趨勢的回答。隨著電動和半自動駕駛汽車發(fā)展的持續(xù)增長,以及隨之而來的軟件組件的增加,研究結(jié)果繼續(xù)表明 ,信息安全與功能安全一樣重要,這是一個主要問題。這反映在對遵守安全標準的要求日益增加。
報告還顯示,MISRA仍然是汽車行業(yè)最受歡迎的編碼標準,42%的受訪者使用MISRA編碼標準。鑒于MISRA的悠久歷史及其汽車根源,這并不奇怪。AUTOSAR是一種在汽車軟件平臺背景下開發(fā)的最新編碼標準,其最終更新于2018年,以36%的得票率位居第三。C++核心指南標準出人意料地以39%的得票率位居第二,盡管該標準與汽車行業(yè)沒有明顯的關(guān)系。它如此受歡迎可能是因為它涵蓋了開發(fā)人員想要使用的最新C++語言功能。
??C++編碼標準的幾個方面
該標準由Bjarne Stroustrup和Herb Sutter推出,是一份不斷改進的動態(tài)文件。C++核心指南也被用作AUTOSAR的來源,因為它涵蓋了最新的C++語言功能。AUTOSAR包括兩個標準之間的比較,表明30%的C++核心指南與AUTOSAR規(guī)則沖突。MISRA C++:2023繼承了AUTOSAR的許多規(guī)則,但沒有直接引用C++核心指南。
我們將專門寫一篇博客來比較這些C++編碼標準的各個方面,包括理念、指南、實施和聲明合規(guī)性。由于MISRA C++:2023似乎不太可能接受所有AUTOSAR規(guī)則,我們將評估與C++核心指南相沖突的規(guī)則部分是否仍然如此之大。
??MISRA C++:2023的新指南和新規(guī)則
最后,我們將在一些博客中專門介紹一些新穎的指南。
MISRA C++規(guī)則12.0.1 “應(yīng)適當提供特殊成員功能”是一項新規(guī)則,為定義類類型的接口提供了指導。它提倡“零規(guī)則”, 它提倡“零規(guī)則”,這意味著它不喜歡指定特殊的成員函數(shù),因為語言標準已經(jīng)保證編譯器已經(jīng)提供了預(yù)期的實現(xiàn)。
這與其他指南相矛盾,例如“五法則”(如果還單獨計算默認構(gòu)造函數(shù),則為六),該指南指出需要始終顯式指定所有特殊成員函數(shù)。
但是,這也存在風險,從為 AUTOSAR 規(guī)則A12-0-1提供的合規(guī)示例可以看出:
Plaintext
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;
};
我們可以看到,只有移動構(gòu)造函數(shù)被刪除,復制函數(shù)和析構(gòu)函數(shù)是默認的。此代碼可能是開發(fā)人員將遵循“三法則”的代碼擴展為“五法則”的結(jié)果,但試圖通過刪除新的移動構(gòu)造函數(shù)來保留舊的行為結(jié)果。MISRA C++不允許這種特殊成員函數(shù)的組合;如果一個類提供復制函數(shù),那么它也必須提供移動構(gòu)造函數(shù)。該類的問題在于它不能與容器一起使用,例如,當試圖聲明該類型的向量時,由于缺少移動構(gòu)造函數(shù),將發(fā)生編譯錯誤。
預(yù)計會產(chǎn)生重大影響的準則是細則4.0.6,“數(shù)字類型之間的分配應(yīng)適當”。此規(guī)則禁止許多隱式類型轉(zhuǎn)換。熟悉MISRA C:2012的開發(fā)人員可能希望擁有與MISRA C基本類型定義的類似類型轉(zhuǎn)換規(guī)則,但事實并非如此。
MISRA C++ 要嚴格得多,這是有原因的:與C相反,C++提供了函數(shù)重載,這取決于表達式的確切類型和自動占位符類型說明符,其中類型是從表達式派生的。如果不遵守規(guī)則,則可能是包含頭文件會導致函數(shù)重載比之前匹配的函數(shù)匹配得更好,這可能是出乎意料的。有一種安全的方法可以避免隱式轉(zhuǎn)換,方法是使用具有整型基礎(chǔ)類型的類型安全枚舉類型。此類強類型的值不受隱式轉(zhuǎn)換的影響。
3??確保MISRA符合Helix QAC的要求
Perforce的Helix QAC是一種靜態(tài)分析工具,在提供MISRA C和MISRA C++合規(guī)性檢查以及許多其他有價值的分析功能方面處于領(lǐng)先地位。
Helix QAC提供合規(guī)模塊,用于執(zhí)行MISRA C和MISRA C++的所有版本和修訂,包括MISRA C:2023。Perforce計劃在正式發(fā)布日期臨近時提供完整的MISRA C++:2023合規(guī)模塊。
-
測試
+關(guān)注
關(guān)注
8文章
5162瀏覽量
126469 -
嵌入式
+關(guān)注
關(guān)注
5068文章
19019瀏覽量
303278 -
MISRA
+關(guān)注
關(guān)注
0文章
21瀏覽量
6960
發(fā)布評論請先 登錄
相關(guān)推薦
評論