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

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

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

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

龍智 ? 來源:jf_15970448 ? 作者:jf_15970448 ? 2024-06-18 12:57 ? 次閱讀

MISRA C++:2023——MISRA? C++ 標準的下一個版本來了!為了幫助您了解 MISRA C++:2023相比于之前版本的變化,我們將繼續(xù)為您帶來Perforce首席技術(shù)支持工程師Frank van den Beuken博士的博客系列,本期為第三篇。

在前兩篇系列文章中,我們向您介紹了新的MISRA C++ 標準C++簡史。本文,我們將仔細研究C++中以for循環(huán)為中心的特定規(guī)則。

什么是MISRA C++:2023規(guī)則9.5.2,為什么它很重要?

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

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

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

編程中,循環(huán)用于重復代碼塊。當您知道要循環(huán)訪問代碼塊的次數(shù)時,可以使用for循環(huán)。

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

傳統(tǒng)的for循環(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 

使用基于范圍的for循環(huán),迭代器的使用是隱式的:

for ( auto &&s: v ) {   std::cout 

對于同一循環(huán),這是一個更為簡單的表示法。C++語言標準規(guī)定,它是以下語言的縮寫:

{   auto && __range = v;   auto __begin = __range;   auto __end = v.end();    for (; __begin != __end; ++__begin) {     auto &&s = *__begin;     std::cout 

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

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

一個循環(huán),輸出以空格分隔的字符串,如上所述

打印第一個字符串的字母的第二個循環(huán),用空格分隔:

std::vector createStrings() {   return { "Example”, "vector", "of", "strings" }; } int main() {   for ( auto w: createStrings() ) { std::cout 

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

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

MISRA C++:2023規(guī)則9.5.2 如何防范未定義行為

MISRA C++:2023規(guī)則 9.5.2 旨在防止這種情況。MISRA C++:2023引入了規(guī)則 9.5.2,該規(guī)則要求for-range-initializer應(yīng)最多包含一個函數(shù)調(diào)用。

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

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

現(xiàn)在,初始值設(shè)定項中只有一個函數(shù)調(diào)用,因此生命周期擴展就能達到預期效果,并且行為已完全定義。

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

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

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

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

- END -

文章來源:https://bit.ly/3VJY8yJ

作者簡介:

Frank van den Beuken,首席技術(shù)支持工程師

作為技術(shù)支持專家,F(xiàn)rank 在集成 Perforce 靜態(tài)源代碼分析解決方案方面擁有超過 20 年的經(jīng)驗,可在客戶軟件開發(fā)環(huán)境中進行軟件質(zhì)量控制。近年來,他專注于為各種編譯器配置靜態(tài)分析。他還提供代碼質(zhì)量培訓和咨詢。Frank 在奈梅亨大學獲得數(shù)學和計算機科學博士學位,研究系統(tǒng)規(guī)范語言。

立即了解為什么Helix QAC是 MISRA C++的最佳靜態(tài)代碼分析器,歡迎咨詢Perforce中國授權(quán)合作伙伴——龍智:

審核編輯 黃宇

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

    關(guān)注

    1

    文章

    29

    瀏覽量

    14565
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2113

    瀏覽量

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

    關(guān)注

    30

    文章

    4807

    瀏覽量

    68786
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    6985
收藏 人收藏

    評論

    相關(guān)推薦

    embOS的MISRA-C:2012一致性

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

    whitepaper-perforce-what-is-misra

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

    代碼靜態(tài)測試工具Klocwork 2024.2新發(fā)布

    Klocwork 2024.2 為現(xiàn)代?C/C++?分析引擎引入了顯著的準確性和性能改進。此版本還包括增強的安全性和身份驗證功能以及改進的用戶體驗,以及?
    的頭像 發(fā)表于 08-06 12:16 ?289次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>靜態(tài)</b>測試工具Klocwork 2024.2新發(fā)布

    ESP8266報錯CONFIG_FREERTOS_HZ未定義,怎么解決這個問題?

    SDK用的是EPS8266_RTOS_SDK,在github上下載的最新版在vscode 上用這個函數(shù)時vTaskDelay(1000 / portTICK_PERIOD_MS);portTICK_PERIOD_MS報錯,提示CONFIG_FREERTOS_HZ未定義,在文件里面沒找到這個宏
    發(fā)表于 06-19 06:06

    esp32s2使用自定義中斷,提示UART0未定義,需要包含什么頭文件?

    | ESP_INTR_FLAG_IRAM, &handle);static void IRAM_ATTR uart0_irq_handler(void *arg) { uint16_t status = UART0.int_st.val; } 提示UART0未定義,不知道需要包含什么頭文件。
    發(fā)表于 06-18 06:25

    TLE9879打開配置文件以后,發(fā)現(xiàn)會提示有些未定義的變量,為什么?

    我打開配置文件以后,發(fā)現(xiàn)會提示有些未定義的變量,然后這個時鐘變量FSYS也變成了_NAN(IND)MHz,不知道是什么問題,請幫忙看一下。
    發(fā)表于 05-29 07:47

    stm8的管腳未定義的原因?

    我使用IAR編譯的時候,包含了iostm8s103f3.h,定義管腳時使用的是_BoolLED@PB_ODR:5;為什么提示我——Bool未定義
    發(fā)表于 05-15 06:00

    帶你走近MISRA C++:2023

    隨著汽車工業(yè)邁入數(shù)字化轉(zhuǎn)型的新紀元,軟件的安全性與可靠性已躍升為設(shè)計和開發(fā)核心環(huán)節(jié)的重中之重。MISRAC++標準的誕生與演進,精準地回應(yīng)了行業(yè)發(fā)展的需求。自MISRAC++標準首次面世以來,它便被
    的頭像 發(fā)表于 04-30 08:24 ?1859次閱讀
    帶你走近<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:<b class='flag-5'>2023</b>

    MotorControl Workbench 5.x.x安裝在非指定目錄,生成的代碼編譯時就會出一大堆的未定義怎么解決?

    如果MotorControl Workbench 5.x.x安裝在非指定目錄,比如e:STMicroelectronicsMC_SDK_5.x.x,生成的代碼編譯時就會出一大堆的未定義。這個需要如何設(shè)置才能正確編譯?(編譯軟件就安裝的程序都沒問題,改到默認目錄安裝就不會出
    發(fā)表于 04-26 06:58

    代碼靜態(tài)測試工具 Helix QAC 2024.1版新功能解讀

    新的問題列表的CSV下載選項。 此版本還包括對于C/C++的CWE、C的HKMC和MISRA C++:2
    的頭像 發(fā)表于 04-25 12:32 ?636次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>靜態(tài)</b>測試工具 Helix QAC 2024.1版新功能<b class='flag-5'>解讀</b>

    STM8S2xx直接用IA編譯報錯,提示未定義的原因?

    大家有沒有遇到官方的STM8S2xx的觸摸例程直接用IA編譯報錯,提示未定義
    發(fā)表于 04-16 07:13

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

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

    已經(jīng)將文件的路徑添加了,頭文件也包含了,為什么編譯會提示未定義符號錯誤?

    我準備添加TFT顯示屏的驅(qū)動,已經(jīng)將文件的路徑添加了,頭文件也包含了,但在編譯時卻提示未定義符號錯誤。
    發(fā)表于 03-07 07:36

    汽車電子行業(yè)的MISRA C標準解讀

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

    Klocwork—符合功能安全要求的自動化靜態(tài)測試工具

    Klocwork是Perforce公司產(chǎn)品,主要用于CC++、C#、Java、 python和Kotlin代碼的自動化
    的頭像 發(fā)表于 01-16 16:26 ?673次閱讀
    Klocwork—符合功能<b class='flag-5'>安全</b>要求的自動化<b class='flag-5'>靜態(tài)</b>測試工具