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