在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

在前兩篇博客中,我們向您介紹了新的 MISRA C++ 標準和C++ 的歷史。在這篇博客中,我們將仔細研究以 C++ 中for循環為中心的特定規則。

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

MISRA C++:2023引入了規則9.5.2,“ for范圍初始值設定項 最多應包含一個函數調用”,以避免在基于范圍的for語句的for范圍初始值設定項創建臨時對象時可能發生的未定義行為。

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

什么是 C++ 中基于范圍的for循環?

編程中,循環用于重復代碼塊。當您知道要在代碼塊中循環多少次時,請使用for循環。

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

傳統循環源自 C 語言,具有可選的循環初始化,然后是循環條件,最后是循環增量表達式。

傳統for循環可用于迭代容器,如下所示:

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 << “ “;?
}

對于同一循環,這是一個更簡單的表示法。C++ 語言標準指出它是以下方面的縮寫:

{
auto && __range = v;
auto __begin = __range;
auto __end = v.end();

for (; __begin != __end; ++__begin) {
auto &&s = *__begin;
std::cout << s << “ “;?
}
}

但是,這種表示法存在一定的局限性。在上面的示例中, __range 是用v初始化的,這是一個更簡單的變量,但也可以使用一個復雜的表達式,為其創建多個臨時對象。

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

  • 一個輸出用空格分隔的字符串的循環,如上所述
  • 第二個循環,打印第一個字符串的字母,用空格分隔:
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;?
}

如果我們執行此操作,第一個循環將按預期運行,但第二個循環將調用未定義的行為。 問題是 createStrings()[0]有兩個函數調用。最里面的調用是createStrings的調用 ,最外面的調用是對索引運算符[]的調用。

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

返回頁首

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

MISRA C++:2023Rule9.5.2 旨在防止這種情況。MISRA C++:2023引入了規則9.5.2,該規則 要求for范圍初始值設定項最多應包含一個函數調用。

它還建議通過在循環范圍之前的單獨聲明中執行內部函數調用來解決此問題。例如:

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

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

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

使用 Helix QAC 執行MISRA C++:2023規則

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

Helix QAC 通過其標準合規性模塊為MISRA C++:2023規則提供100%的強制執行覆蓋率,現已推出。靜態分析工具查找并報告C和C++中違反MISRA規則和指令的情況。

歡迎聯系北匯信息,申請Helix QAC試用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136813
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68603
  • MISRA
    +關注

    關注

    0

    文章

    21

    瀏覽量

    6968
收藏 人收藏

    評論

    相關推薦

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

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

    C++在嵌入式應用中的機遇與挑戰是什么?

    C++在嵌入式應用中的機遇與挑戰是什么?什么是MISRA C++
    發表于 04-28 06:25

    C++語言基礎講解視頻do while循環語句

    C++語言基礎講解視頻do while循環語句
    發表于 01-14 15:32 ?5次下載

    C++語言基礎講解視頻while循環語句

    C++語言基礎講解視頻while循環語句,喜歡的朋友可以下載來學習。
    發表于 01-14 15:31 ?3次下載

    軟件編程規范(MISRA-C)

    MISRA-C是一種汽車制造業嵌入式C編碼標準。FreeRTOS符合MISRA-C編程規范,就連大名鼎鼎的uCOS也宣稱基本符合MISRA-C編程規范。
    發表于 11-02 18:29 ?26次下載

    C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數等

    循環,多態性,數組,模板,習題,STL編程,預處理,指針,結構體,位運算,文件,常見錯誤c++模板使用疑問等
    發表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料詳細資料合集包括了:面向對象程序設計與<b class='flag-5'>C++</b>,算法,函數等

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

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

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

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

    西門子博途SCL: FOR:在計數循環中執行

    使用“在計數循環中執行”指令,重復執行程序循環,直至運行變量不在指定的取值范圍內。
    的頭像 發表于 07-18 10:07 ?9347次閱讀

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

    Helix QAC 2023.2 提供 100% 的 MISRA C:2012 和 MISRA C2023 規則覆蓋率,并更新相應的合規性
    的頭像 發表于 07-31 22:53 ?1195次閱讀
    靜態代碼分析器工具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> 規則覆蓋率

    您需要了解的有關下一個MISRA?標準的信息:MISRA C++ 2023?簡介

    MISRA C++2023?是廣受期待的MISRA C++ ?標準的下一個版本,將于今年晚些時候發布。新版本將整合AUTOSAR
    的頭像 發表于 08-25 18:06 ?1326次閱讀
    您需要了解的有關下一個<b class='flag-5'>MISRA</b>?標準的信息:<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b> <b class='flag-5'>2023</b>?簡介

    靜態代碼分析工具Helix QAC 2023.3:將100%覆蓋MISRA C++:2023?規則

    Helix QAC 2023.3預計將于2023年第四季度發布的新MISRA C++?指南,將100%覆蓋MISRA C++:
    的頭像 發表于 11-08 18:37 ?521次閱讀
    靜態代碼分析工具Helix QAC 2023.3:將100%覆蓋<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:<b class='flag-5'>2023</b>?規則

    C++簡史:C++是如何開始的

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

    Perforce靜態代碼分析專家解讀MISRA C++2023?新標準:如何安全、高效地使用基于范圍的for循環,防范未定義行

    MISRA C++2023——MISRA? C++ 標準的下一個版本來了!為了幫助您了解 MISRA
    的頭像 發表于 06-18 12:57 ?421次閱讀

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式軟件的世界,您可能聽說過安全關鍵系統的MISRA編碼準則和合規性。最初為在汽車嵌入式軟件行業,MISRA C for CC++
    發表于 08-08 15:54 ?0次下載
    主站蜘蛛池模板: 色播基地| 你懂的在线视频观看| 免看一级a一片成人123| 成 年 人 视频在线播放| 国产真实灌醉美女疯狂弄| 男女在线观看视频| 日本黄色大片在线观看| 一级一片一a一片| 狼狼鲁狼狼色| 色婷婷丁香| 在线免费视频| 黄色网址网站在线观看| 色综合97天天综合网| a级毛片免费网站| 国产老肥熟xxxx| 日本一卡二卡≡卡四卡精品| 一本到午夜92版免费福利| 很黄网站| 日本午夜三级| 天天挨操| 一级欧美日韩| 国产三级在线免费观看| 白嫩美女一级高清毛片免费看| 亚洲国产精品嫩草影院| 国产精品一区二区三区四区五区| 俺要操| 视频黄色免费| 天天天天天天天操| 狠狠色噜噜综合社区| 久久偷窥视频| 福利观看| 日韩三级小视频| 欧美影院| 亚洲三级小视频| 真实子伦视频不卡| 欧美一区二区不卡视频| 激情六月婷婷| 欧美最猛黑人xxxx黑人猛交69| 日韩美aaa特级毛片| 男人午夜影院| 天天噜噜日日噜噜久久综合网|