RM新时代网站-首页

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

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

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

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

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

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

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

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

MISRA C++:2023引入了規(guī)則9.5.2,“ for范圍初始值設(shè)定項 最多應(yīng)包含一個函數(shù)調(diào)用”,以避免在基于范圍的for語句的for范圍初始值設(shè)定項創(chuàng)建臨時對象時可能發(fā)生的未定義行為。

為了理解為什么會發(fā)生這種情況,讓我們仔細看看基于 C++ 范圍的for循環(huán)。

什么是 C++ 中基于范圍的for循環(huán)?

編程中,循環(huán)用于重復(fù)代碼塊。當(dāng)您知道要在代碼塊中循環(huán)多少次時,請使用for循環(huán)。

C++ 基于范圍的for循環(huán)是在C++11中引入的,作為容器迭代的簡潔表示法。

傳統(tǒng)循環(huán)源自 C 語言,具有可選的循環(huán)初始化,然后是循環(huán)條件,最后是循環(huán)增量表達式。

傳統(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時,迭代器的使用是隱式的:

for ( auto &&s: v ) {
std::cout << s << “ “;?
}

對于同一循環(huán),這是一個更簡單的表示法。C++ 語言標(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初始化的,這是一個更簡單的變量,但也可以使用一個復(fù)雜的表達式,為其創(chuàng)建多個臨時對象。

讓我們考慮使用一個函數(shù),該函數(shù)返回字符串的向量,并具有:

  • 一個輸出用空格分隔的字符串的循環(huán),如上所述
  • 第二個循環(huán),打印第一個字符串的字母,用空格分隔:
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í)行此操作,第一個循環(huán)將按預(yù)期運行,但第二個循環(huán)將調(diào)用未定義的行為。 問題是 createStrings()[0]有兩個函數(shù)調(diào)用。最里面的調(diào)用是createStrings的調(diào)用 ,最外面的調(diào)用是對索引運算符[]的調(diào)用。

未定義行為的原因是 “ createStrings ”返回的臨時對象 用作“ operator[ ]”調(diào)用的參數(shù),因此,根據(jù)C++的規(guī)則,臨時對象的生存期不會延長。

返回頁首

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

MISRA C++:2023Rule9.5.2 旨在防止這種情況。MISRA C++:2023引入了規(guī)則9.5.2,該規(guī)則 要求for范圍初始值設(shè)定項最多應(yīng)包含一個函數(shù)調(diào)用。

它還建議通過在循環(huán)范圍之前的單獨聲明中執(zhí)行內(nèi)部函數(shù)調(diào)用來解決此問題。例如:

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

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

請注意,此問題已在 C++23 中得到解決,其中初始值設(shè)定項的所有臨時項的生存期已擴展到整個for語句。

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

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

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

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

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

    關(guān)注

    180

    文章

    7604

    瀏覽量

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

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    6963
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    靜態(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 ?1181次閱讀
    靜態(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)下一個MISRA?標(biāo)準(zhǔn)的信息:MISRA C++ 2023?簡介

    MISRA C++2023?是廣受期待的MISRA C++ ?標(biāo)準(zhǔn)的下一個版本,將于今年晚些時候發(fā)布。新版本將整合AUTOSAR
    的頭像 發(fā)表于 08-25 18:06 ?1315次閱讀
    您需要了解的有關(guān)下一個<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>?簡介

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

    Helix QAC 2023.3預(yù)計將于2023年第四季度發(fā)布的新MISRA C++?指南,將100%覆蓋MISRA C++:
    的頭像 發(fā)表于 11-08 18:37 ?514次閱讀
    靜態(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++簡史:C++是如何開始的

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

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

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

    whitepaper-perforce-what-is-misra

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