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