0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

帶你走近MISRA C++:2023

北匯信息POLELINK ? 2024-04-30 08:24 ? 次閱讀

作者 | 給你小魚(yú)干
小編 | 不吃豬頭肉

隨著汽車工業(yè)邁入數(shù)字化轉(zhuǎn)型的新紀(jì)元,軟件的安全性與可靠性已躍升為設(shè)計(jì)和開(kāi)發(fā)核心環(huán)節(jié)的重中之重。MISRA C++標(biāo)準(zhǔn)的誕生與演進(jìn),精準(zhǔn)地回應(yīng)了行業(yè)發(fā)展的需求。自MISRA C++標(biāo)準(zhǔn)首次面世以來(lái),它便被奉為汽車軟件工程師在開(kāi)發(fā)實(shí)踐中的圭臬。
11b82212-0688-11ef-9118-92fbcf53809c.png

MISRA C++的發(fā)展史
MISRA C++的起源可以追溯到MISRA C標(biāo)準(zhǔn)的成功制定和廣泛應(yīng)用。MISRA C是一套針對(duì)C語(yǔ)言的編碼規(guī)范,首次發(fā)布于1998年,它迅速成為汽車行業(yè)中軟件安全性和可靠性的標(biāo)桿。(回顧MISRA C:2012介紹請(qǐng)見(jiàn)文章

帶你走近MISRA C:2012》)隨著C++在工業(yè)界的普及,尤其是在汽車電子控制系統(tǒng)中,對(duì)C++的類似規(guī)范的需求日益增長(zhǎng)?;贛ISRA C的成功經(jīng)驗(yàn)和市場(chǎng)需求,MISRA組織隨后發(fā)布了適用于C++03標(biāo)準(zhǔn)的編碼規(guī)范MISRA C++:2008。這是首個(gè)針對(duì)C++語(yǔ)言的MISRA標(biāo)準(zhǔn),包含一系列的規(guī)則和指導(dǎo)原則,這些規(guī)則覆蓋了從編程實(shí)踐到代碼設(shè)計(jì)等多個(gè)方面,旨在幫助開(kāi)發(fā)者編寫出更加安全和可靠的代碼。
MISRA C++:2008規(guī)范發(fā)布后,得到了業(yè)界的廣泛認(rèn)可和采納。它不僅在汽車行業(yè)中得到了應(yīng)用,還擴(kuò)展到了航空、醫(yī)療設(shè)備和工業(yè)控制等多個(gè)領(lǐng)域,并對(duì)這些行業(yè)產(chǎn)生了深遠(yuǎn)的影響。隨著C++語(yǔ)言標(biāo)準(zhǔn)的不斷更新和新特性的引入,MISRA C++:2008也在經(jīng)歷不斷的修訂和更新,以保持與C++標(biāo)準(zhǔn)語(yǔ)言的同步,并覆蓋新出現(xiàn)的語(yǔ)言特性。MISRA C++:2008與AUTOSAR C++14
但隨著后續(xù)新版本C++標(biāo)準(zhǔn)的發(fā)布,MISRA C++:2008并未將新的C++語(yǔ)言特性納入,于是AUTOSAR組織發(fā)布了AUTOSAR C++14編碼規(guī)范。
AUTOSAR C++14在制定時(shí),大量借鑒了MISRA C++:2008的規(guī)則。MISRA C++:2008是基于C++03標(biāo)準(zhǔn)制定的,而AUTOSAR C++14則是基于更新的C++14標(biāo)準(zhǔn)。AUTOSAR C++14吸收了約91%的MISRA C++:2008規(guī)則,并對(duì)其進(jìn)行了擴(kuò)展和更新,引入了針對(duì)C++11/14特性的規(guī)范。

11d8b946-0688-11ef-9118-92fbcf53809c.png

MISRA C++:2023
MISRA C++:2023發(fā)布于2023年10月,這是MISRA C++的最新版本。它為使用ISO/IEC 1488217) 開(kāi)發(fā)的安全關(guān)鍵型軟件的組織提供指導(dǎo)。MISRA C++:2023規(guī)則分類
MISRA C++:2023整合了AUTOSAR C++14編碼規(guī)范, 共179條準(zhǔn)則。這些規(guī)則按照性質(zhì)分為兩類:Rule(規(guī)則)和Directive(指令),包含175條Rule和4條Directive。規(guī)則有三種不同類別:” Mandatory(強(qiáng)制)”、” Required(要求)”和“Advisory(建議)”, Mandatory類別的規(guī)則中包含5條Rule,Required規(guī)則中包含122條Rule和4條Directive,Advisory規(guī)則中包含48條Rule。
11feef76-0688-11ef-9118-92fbcf53809c.png圖1 MISRA C++:2023規(guī)則分類
122724e6-0688-11ef-9118-92fbcf53809c.png圖2 MISRA C++:2023規(guī)則類別MISRA C++:2023還引入了MISRA C++的Rule可判定性分類??膳卸ㄐ詤^(qū)分標(biāo)準(zhǔn)為是否能在任何情況下明確回答“該代碼是否遵循了這條規(guī)則?”這個(gè)問(wèn)題。
123cb9fa-0688-11ef-9118-92fbcf53809c.png1257faf8-0688-11ef-9118-92fbcf53809c.png圖3 Rule的可判定性分類要注意的是,可判定性并不適用于Directive規(guī)則。接下來(lái)讓我們進(jìn)一步了解MISRA C++:2023編碼規(guī)范。

1275b16a-0688-11ef-9118-92fbcf53809c.png

什么是 MISRA C++:2023 Rule 9.5.2,為什么它很重要?MISRA C++:2023 引入了Rule 9.5.2:“ for 范圍初始值設(shè)定項(xiàng)最多應(yīng)包含一個(gè)函數(shù)調(diào)用”,以避免在基于范圍的 for 語(yǔ)句的 for 范圍初始值設(shè)定項(xiàng)創(chuàng)建臨時(shí)對(duì)象時(shí)可能發(fā)生的未定義行為。
為了理解為什么會(huì)發(fā)生這種情況,讓我們仔細(xì)看看基于 C++ 范圍的 for 循環(huán)。
什么是 C++ 中基于范圍的 for 循環(huán)?
在編程中,循環(huán)用于重復(fù)代碼塊。當(dāng)我們知道要在代碼塊中循環(huán)多少次時(shí)會(huì)使用for循環(huán)。C++ 基于范圍的 for 循環(huán)是在 C++11 中引入的,作為容器迭代的簡(jiǎn)潔表示法。傳統(tǒng)循環(huán)源自 C 語(yǔ)言,具有可選的循環(huán)初始化,然后是循環(huán)條件,最后是循環(huán)增量表達(dá)式。
傳統(tǒng)for循環(huán)可用于迭代容器,如下所示:

std::vector v = { "Example", "vector", "of", "strings" };

for ( auto &&i = v.begin(); i != v.end(); ++i ) {

std::cout << *i << “ “;?

}

std::cout << std::endl;?

使用基于范圍的for時(shí),迭代器的使用是隱式的:

for ( auto &&s: v ) {

std::cout << s << “ “;?

}

對(duì)于同一循環(huán),這是一個(gè)更簡(jiǎn)單的表示法。C++ 語(yǔ)言標(biāo)準(zhǔn)指出它是以下方面的縮寫:

{

auto && __range = v;

auto __begin = __range;

auto __end = v.end();

for (; __begin != __end; ++__begin) {

auto &&s = *__begin;

std::cout << s << “ “;?

}

}

但是,這種表示法存在一定的局限性。在上面的示例中, __range 是用 v 初始化的,這是一個(gè)更簡(jiǎn)單的變量,但也可以使用一個(gè)復(fù)雜的表達(dá)式,為其創(chuàng)建多個(gè)臨時(shí)對(duì)象。

讓我們考慮使用一個(gè)函數(shù),該函數(shù)返回字符串的向量,并具有:?一個(gè)輸出用空格分隔的字符串的循環(huán),如上所述;?第二個(gè)循環(huán),打印第一個(gè)字符串的字母,用空格分隔

std::vectorcreateStrings() {

return { "Example”, "vector", "of", "strings" };

}

int main() {

for ( auto w: createStrings() ) { std::cout << w << " "; }?

std::cout << std::endl;?

for ( auto c: createStrings()[0] ) { std::cout << c << " "; }?

std::cout << std::endl;?

}

如果我們執(zhí)行此操作,第一個(gè)循環(huán)將按預(yù)期運(yùn)行,但第二個(gè)循環(huán)將調(diào)用未定義的行為 。問(wèn)題是 createStrings()[0] 有兩個(gè)函數(shù)調(diào)用。最里面的調(diào)用是 createStrings 的調(diào)用 ,最外面的調(diào)用是對(duì)索引運(yùn)算符[ ]的調(diào)用。

未定義行為的原因是 “ createStrings ”返回的臨時(shí)對(duì)象 用作“ operator[ ]”調(diào)用的參數(shù),因此,根據(jù) C++ 的規(guī)則,臨時(shí)對(duì)象的生存期不會(huì)延長(zhǎng)。
MISRA C++:2023 Rule 9.5.2 如何防范未定義的行為
MISRA C++:2023 Rule 9.5.2 旨在防止這種情況。MISRA C++:2023 引入了規(guī)則 9.5.2,該規(guī)則要求for范圍初始值設(shè)定項(xiàng)最多應(yīng)包含一個(gè)函數(shù)調(diào)用。
它還建議通過(guò)在循環(huán)范圍之前的單獨(dú)聲明中執(zhí)行內(nèi)部函數(shù)調(diào)用來(lái)解決此問(wèn)題。例如:

auto strings = createStrings();

for ( auto c: strings[0] ) { std::cout << c << " "; }?

現(xiàn)在,初始值設(shè)定項(xiàng)中只有一個(gè)函數(shù)調(diào)用,因此生存期擴(kuò)展具有所需的效果,并且行為已完全定義。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)字化
    +關(guān)注

    關(guān)注

    8

    文章

    8351

    瀏覽量

    61385
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    6945
  • 汽車
    +關(guān)注

    關(guān)注

    12

    文章

    3269

    瀏覽量

    36828
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    embOS的MISRA-C:2012一致性

    MISRA C是汽車工業(yè)軟件可靠性協(xié)會(huì)(MISRA)開(kāi)發(fā)的一套針對(duì)C編程語(yǔ)言的軟件開(kāi)發(fā)指南,目的是提升嵌入式系統(tǒng)的安全性和可移植性。2012發(fā)布的M
    的頭像 發(fā)表于 08-20 11:35 ?261次閱讀

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式軟件的世界,您可能聽(tīng)說(shuō)過(guò)安全關(guān)鍵系統(tǒng)的MISRA編碼準(zhǔn)則和合規(guī)性。最初為在汽車嵌入式軟件行業(yè),MISRA C for CC++
    發(fā)表于 08-08 15:54 ?0次下載

    C++語(yǔ)言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語(yǔ)言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?6次下載

    C++中實(shí)現(xiàn)類似instanceof的方法

    C++有多態(tài)與繼承,但是很多人開(kāi)始學(xué)習(xí)C++,有時(shí)候會(huì)面臨一個(gè)常見(jiàn)問(wèn)題,就是如何向下轉(zhuǎn)型,特別是不知道具體類型的時(shí)候,這個(gè)時(shí)候就希望C++ 可以向Java或者Python中有instanceof這個(gè)
    的頭像 發(fā)表于 07-18 10:16 ?355次閱讀
    <b class='flag-5'>C++</b>中實(shí)現(xiàn)類似instanceof的方法

    Perforce靜態(tài)代碼分析專家解讀MISRA C++2023?新標(biāo)準(zhǔn):如何安全、高效地使用基于范圍的for循環(huán),防范未定義行

    MISRA C++2023——MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本來(lái)了!為了幫助您了解 MISRA
    的頭像 發(fā)表于 06-18 12:57 ?217次閱讀

    MISRA-C-:2004中文版

    MISRA-C-:2004 中文版
    發(fā)表于 06-04 11:52 ?1次下載

    使用 MISRA C++2023? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標(biāo)準(zhǔn)?和?C++ 的歷史?。在這篇博客中,我們將仔細(xì)研究以 C++ 中?for?循環(huán)為中心的特定規(guī)則。
    的頭像 發(fā)表于 03-28 13:53 ?517次閱讀
    使用 <b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:<b class='flag-5'>2023</b>? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言: C語(yǔ)言是一種面向過(guò)程的編程語(yǔ)言。它具有底層的特性,能夠?qū)τ?jì)算機(jī)硬件進(jìn)行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?1366次閱讀

    汽車電子行業(yè)的MISRA C標(biāo)準(zhǔn)解讀

    之前分享了一些編程規(guī)范相關(guān)的文章,有位讀者提到了汽車電子行業(yè)的MISRA C標(biāo)準(zhǔn),說(shuō)這個(gè)很不錯(cuò)。
    的頭像 發(fā)表于 01-17 11:03 ?890次閱讀

    代碼靜態(tài)測(cè)試工具Helix QAC 2023.4新發(fā)布

    Helix QAC 2023.4 為新的 MISRA C++2023 指南推出了 100% MISRA C++
    的頭像 發(fā)表于 01-13 12:25 ?351次閱讀
    代碼靜態(tài)測(cè)試工具Helix QAC 2023.4新發(fā)布

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工
    的頭像 發(fā)表于 01-11 09:00 ?427次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    C語(yǔ)言和C++中那些不同的地方

    C語(yǔ)言雖說(shuō)經(jīng)常和C++在一起被大家提起,但可千萬(wàn)不要以為它們是一個(gè)東西?,F(xiàn)在我們常用的C語(yǔ)言是C89標(biāo)準(zhǔn),C++
    的頭像 發(fā)表于 12-07 14:29 ?773次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b>中那些不同的地方

    c++怎么開(kāi)始編程

    C++是一種高級(jí)的、通用的編程語(yǔ)言,用于開(kāi)發(fā)各種類型的應(yīng)用程序。它是從C語(yǔ)言演變而來(lái),也是一種靜態(tài)類型語(yǔ)言,可以在不同的平臺(tái)上進(jìn)行開(kāi)發(fā)。C++具有高度的靈活性和性能,并且廣泛應(yīng)用于游戲開(kāi)發(fā)、桌面
    的頭像 發(fā)表于 11-27 15:56 ?736次閱讀

    靜態(tài)代碼分析工具Helix QAC 2023.3:將100%覆蓋MISRA C++:2023?規(guī)則

    Helix QAC 2023.3預(yù)計(jì)將于2023年第四季度發(fā)布的新MISRA C++?指南,將100%覆蓋MISRA C++:
    的頭像 發(fā)表于 11-08 18:37 ?434次閱讀
    靜態(tài)代碼分析工具Helix QAC 2023.3:將100%覆蓋<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:<b class='flag-5'>2023</b>?規(guī)則

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?696次閱讀
    <b class='flag-5'>C++</b>之父新作<b class='flag-5'>帶你</b>勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖