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

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

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

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

北匯信息POLELINK ? 2024-03-28 13:53 ? 次閱讀

MISRA C++:2023?,MISRAC++標(biāo)準(zhǔn)的下一個(gè)版本,就在這里!為了幫助您了解MISRA C++:2023與上一版本之間的變化,我們繼續(xù)Perforce首席技術(shù)支持工程師Frank van den Beuken博士撰寫(xiě)的第三期博客系列。

在前兩篇博客中,我們向您介紹了新的 MISRA C++ 標(biāo)準(zhǔn)和C++ 的歷史。在這篇博客中,我們將仔細(xì)研究以 C++ 中for循環(huán)為中心的特定規(guī)則。

什么是 MISRA C++:2023Rule9.5.2,為什么它很重要?

MISRA C++:2023引入了規(guī)則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í),請(qǐng)使用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)指出它是以下方面的縮寫(xiě):

{
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::vector createStrings() {
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)。

返回頁(yè)首

MISRA C++:2023Rule9.5.2 如何防范未定義的行為

MISRA C++:2023Rule9.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ò)展具有所需的效果,并且行為已完全定義。

請(qǐng)注意,此問(wèn)題已在 C++23 中得到解決,其中初始值設(shè)定項(xiàng)的所有臨時(shí)項(xiàng)的生存期已擴(kuò)展到整個(gè)for語(yǔ)句。

使用 Helix QAC 執(zhí)行MISRA C++:2023規(guī)則

Perforce 的Helix QAC是一種靜態(tài)分析工具,在提供 MISRA C 和MISRA C++合規(guī)性檢查以及許多其他有價(jià)值的分析功能方面處于領(lǐng)先地位。

Helix QAC 通過(guò)其標(biāo)準(zhǔn)合規(guī)性模塊為MISRA C++:2023規(guī)則提供100%的強(qiáng)制執(zhí)行覆蓋率,現(xiàn)已推出。靜態(tài)分析工具查找并報(bào)告C和C++中違反MISRA規(guī)則和指令的情況。

歡迎聯(lián)系北匯信息,申請(qǐng)Helix QAC試用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135849
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    6956
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    同一事件在不同的循環(huán)中發(fā)生,為什么只要進(jìn)入別的循環(huán)就會(huì)直接動(dòng)作?怎樣避免

    本帖最后由 我拿吉他彈棉花 于 2017-5-29 15:10 編輯 比如按鈕就是,一個(gè)按鈕在五個(gè)不同的循環(huán)中發(fā)生同樣的事件。只要進(jìn)入另外一個(gè)循環(huán)就直接發(fā)生了!怎么避免。點(diǎn)一次就在本循環(huán)
    發(fā)表于 05-02 15:21

    C++在嵌入式應(yīng)用中的機(jī)遇與挑戰(zhàn)是什么?

    C++在嵌入式應(yīng)用中的機(jī)遇與挑戰(zhàn)是什么?什么是MISRA C++
    發(fā)表于 04-28 06:25

    C++語(yǔ)言基礎(chǔ)講解視頻do while循環(huán)語(yǔ)句

    C++語(yǔ)言基礎(chǔ)講解視頻do while循環(huán)語(yǔ)句
    發(fā)表于 01-14 15:32 ?5次下載

    C++語(yǔ)言基礎(chǔ)講解視頻while循環(huán)語(yǔ)句

    C++語(yǔ)言基礎(chǔ)講解視頻while循環(huán)語(yǔ)句,喜歡的朋友可以下載來(lái)學(xué)習(xí)。
    發(fā)表于 01-14 15:31 ?3次下載

    軟件編程規(guī)范(MISRA-C)

    MISRA-C是一種汽車(chē)制造業(yè)嵌入式C編碼標(biāo)準(zhǔn)。FreeRTOS符合MISRA-C編程規(guī)范,就連大名鼎鼎的uCOS也宣稱基本符合MISRA-C編程規(guī)范。
    發(fā)表于 11-02 18:29 ?26次下載

    C++課程資料詳細(xì)資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與C++,算法,函數(shù)等

    ,循環(huán),多態(tài)性,數(shù)組,模板,習(xí)題,STL編程,預(yù)處理,指針,結(jié)構(gòu)體,位運(yùn)算,文件,常見(jiàn)錯(cuò)誤c++模板使用疑問(wèn)等
    發(fā)表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料詳細(xì)資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與<b class='flag-5'>C++</b>,算法,函數(shù)等

    MISRA C在安全可靠編程中的地位

    MISRA C指南的覆蓋范圍上尤其競(jìng)爭(zhēng),因?yàn)椴豢赡軋?zhí)行MISRA C的所有16個(gè)指令和143個(gè)規(guī)則(統(tǒng)稱為指南)。
    的頭像 發(fā)表于 11-23 11:55 ?934次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在安全可靠編程中的地位

    如何將MISRA C2023整合到您的嵌入式開(kāi)發(fā)流程中

    MISRA C不是編碼風(fēng)格指南,而是一套規(guī)則和指令,用于最小化或消除已知危險(xiǎn)的編碼實(shí)踐。鑒于對(duì)安全和安保關(guān)鍵型系統(tǒng)的這種重要性,AMD4 和 MISRA C
    的頭像 發(fā)表于 05-04 09:58 ?2796次閱讀
    如何將<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:<b class='flag-5'>2023</b>整合到您的嵌入式開(kāi)發(fā)流程中

    西門(mén)子博途SCL: FOR:在計(jì)數(shù)循環(huán)中執(zhí)行

    使用“在計(jì)數(shù)循環(huán)中執(zhí)行”指令,重復(fù)執(zhí)行程序循環(huán),直至運(yùn)行變量不在指定的取值范圍內(nèi)。
    的頭像 發(fā)表于 07-18 10:07 ?8980次閱讀

    靜態(tài)代碼分析器工具Helix QAC 2023.2: 提供 100% 的 MISRA C:2012 和 MISRA C2023 規(guī)則覆蓋率

    Helix QAC 2023.2 提供 100% 的 MISRA C:2012 和 MISRA C2023 規(guī)則覆蓋率,并更新相應(yīng)的合規(guī)性
    的頭像 發(fā)表于 07-31 22:53 ?1107次閱讀
    靜態(tài)代碼分析器工具Helix QAC 2023.2: 提供 100% 的 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2012 和 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:<b class='flag-5'>2023</b> 規(guī)則覆蓋率

    您需要了解的有關(guān)下一個(gè)MISRA?標(biāo)準(zhǔn)的信息:MISRA C++ 2023?簡(jiǎn)介

    MISRA C++2023?是廣受期待的MISRA C++ ?標(biāo)準(zhǔn)的下一個(gè)版本,將于今年晚些時(shí)候發(fā)布。新版本將整合AUTOSAR
    的頭像 發(fā)表于 08-25 18:06 ?1269次閱讀
    您需要了解的有關(guān)下一個(gè)<b class='flag-5'>MISRA</b>?標(biāo)準(zhǔn)的信息:<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b> <b class='flag-5'>2023</b>?簡(jiǎn)介

    靜態(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 ?492次閱讀
    靜態(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++簡(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 ?513次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    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 ?331次閱讀

    whitepaper-perforce-what-is-misra

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