一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

龍智 ? 來源:jf_15970448 ? 作者:jf_15970448 ? 2024-06-18 12:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

傳統(tǒng)的for循環(huán)起源于C語言,具有可選的循環(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 

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

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

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

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

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

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

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

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

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

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

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

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)最多包含一個(gè)函數(shù)調(diào)用。

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

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

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

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

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

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

Helix QAC通過其標(biāo)準(zhǔn)的合規(guī)模塊為 MISRA C++:2023 規(guī)則提供 100% 的執(zhí)行覆蓋率,該模塊現(xiàn)已推出。通過靜態(tài)分析工具Helix QAC可查找并報(bào)告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)驗(yàn),可在客戶軟件開發(fā)環(huán)境中進(jìn)行軟件質(zhì)量控制。近年來,他專注于為各種編譯器配置靜態(tài)分析。他還提供代碼質(zhì)量培訓(xùn)和咨詢。Frank 在奈梅亨大學(xué)獲得數(shù)學(xué)和計(jì)算機(jī)科學(xué)博士學(xué)位,研究系統(tǒng)規(guī)范語言。

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

審核編輯 黃宇

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

    關(guān)注

    1

    文章

    29

    瀏覽量

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

    關(guān)注

    22

    文章

    2118

    瀏覽量

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

    關(guān)注

    30

    文章

    4893

    瀏覽量

    70441
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    7196
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Helix QAC 2025.1 重磅發(fā)布!MISRA C:2025? 100%覆蓋

    Helix QAC 2025.1新增功能 Helix QAC 2025.1實(shí)現(xiàn)了對新版MISRA C:2025?標(biāo)準(zhǔn)的 100% 覆蓋,并提供對應(yīng)的合規(guī)模塊。此版本還擴(kuò)展了對 CERT C
    的頭像 發(fā)表于 05-13 16:48 ?296次閱讀
    Helix QAC 2025.1 重磅發(fā)布!<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2025? 100%覆蓋

    MISRA C:2025新標(biāo)準(zhǔn)解析:新增規(guī)則、優(yōu)化點(diǎn)與靜態(tài)代碼分析工具支持(Perforce QAC、Klocwork)

    MISRA C:2025?發(fā)布!新增5條規(guī)則,并對部分現(xiàn)有規(guī)則進(jìn)行了擴(kuò)展、重組,以進(jìn)一步簡化安全關(guān)鍵型系統(tǒng)的開發(fā)流程。如何實(shí)現(xiàn)最新MISRA合規(guī)性?
    的頭像 發(fā)表于 05-08 17:58 ?735次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2025<b class='flag-5'>新標(biāo)準(zhǔn)</b>解析:新增規(guī)則、優(yōu)化點(diǎn)與<b class='flag-5'>靜態(tài)</b><b class='flag-5'>代碼</b><b class='flag-5'>分析</b>工具支持(<b class='flag-5'>Perforce</b> QAC、Klocwork)

    代碼靜態(tài)測試工具Perforce QAC 2025.1新特性

    Perforce QAC 2025.1實(shí)現(xiàn)了對新發(fā)布的MISRA C:2025?標(biāo)準(zhǔn)的100%覆蓋,并提供了對應(yīng)的新合規(guī)模塊。該版本還擴(kuò)展了對CERT
    的頭像 發(fā)表于 04-21 15:14 ?298次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>靜態(tài)</b>測試工具<b class='flag-5'>Perforce</b> QAC 2025.1新特性

    Perforce品牌及產(chǎn)品名更新:涵蓋版本控制Perforce P4(原Helix Core)、靜態(tài)代碼分析Perforce QAC(原Helix QAC)等

    Perforce推出全新P4平臺及P4 One客戶端!從廣為人知的“P4”到Helix Core到Perforce P4,此次品牌重塑是一次初心回歸,也是對開發(fā)者和數(shù)字創(chuàng)作團(tuán)隊(duì)需求的深度回應(yīng)。一起來了解更多吧~
    的頭像 發(fā)表于 03-28 15:04 ?537次閱讀
    <b class='flag-5'>Perforce</b>品牌及產(chǎn)品名更新:涵蓋版本控制<b class='flag-5'>Perforce</b> P4(原Helix Core)、<b class='flag-5'>靜態(tài)</b><b class='flag-5'>代碼</b><b class='flag-5'>分析</b><b class='flag-5'>Perforce</b> QAC(原Helix QAC)等

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個(gè)推理過程中使用相同的圖像和模型。 從 C++ 代碼
    發(fā)表于 03-06 06:22

    緩沖區(qū)溢出漏洞的原理、成因、類型及最佳防范實(shí)踐(借助Perforce 的Klocwork/Hleix QAC等靜態(tài)代碼分析工具)

    本期來認(rèn)識軟件漏洞的“??汀薄彌_區(qū)溢出,C/C++開發(fā)者尤其要注意!全面了解該漏洞的成因、類型、常見示例,以及如何借助Klocwork、Helix QAC等SAST工具進(jìn)行防護(hù)。
    的頭像 發(fā)表于 03-04 16:39 ?800次閱讀
    緩沖區(qū)溢出漏洞的原理、成因、類型及最佳<b class='flag-5'>防范</b>實(shí)踐(借助<b class='flag-5'>Perforce</b> 的Klocwork/Hleix QAC等<b class='flag-5'>靜態(tài)</b><b class='flag-5'>代碼</b><b class='flag-5'>分析</b>工具)

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:Semaphore

    1、程序簡介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫的線程處理:Sempahore。本案例完成如下工作:(1)無名信號量使用方法定義1個(gè)無名信號量,1個(gè)供無名信號量管理
    的頭像 發(fā)表于 02-10 18:08 ?311次閱讀
    基于OpenHarmony<b class='flag-5'>標(biāo)準(zhǔn)</b>系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:Semaphore

    C2000? MISRA-C策略

    電子發(fā)燒友網(wǎng)站提供《C2000? MISRA-C策略.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 11:43 ?0次下載
    <b class='flag-5'>C</b>2000? <b class='flag-5'>MISRA-C</b>策略

    PSOC6將藍(lán)牙A2DP源移植到STM32未定義引用\"\" 錯(cuò)誤,如何解決?

    我正在嘗試將 PSOC6 藍(lán)牙 A2DP 信號源導(dǎo)入 STM32。 但我檢查了所有內(nèi)容,卻得到一個(gè)未定義引用的錯(cuò)誤,如何解決?
    發(fā)表于 09-23 06:15

    embOS的MISRA-C:2012一致性

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

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式軟件的世界,您可能聽說過安全關(guān)鍵系統(tǒng)的MISRA編碼準(zhǔn)則和合規(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++?分析引擎引入了顯著的準(zhǔn)確性和性能改進(jìn)。此版本還包括增強(qiáng)的安全性和身份驗(yàn)證功能以及改進(jìn)的用戶體驗(yàn),以及?
    的頭像 發(fā)表于 08-06 12:16 ?550次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>靜態(tài)</b>測試工具Klocwork 2024.2新發(fā)布

    滿足IEC62368.1最新標(biāo)準(zhǔn)的電氣安規(guī)測試解決方案

    IEC62368最新標(biāo)準(zhǔn)解讀:基于IEC 62368-1?測試電氣設(shè)備
    的頭像 發(fā)表于 07-23 16:51 ?1159次閱讀
    滿足IEC62368.1最<b class='flag-5'>新標(biāo)準(zhǔn)</b>的電氣安規(guī)測試解決方案

    GD32F3使用串口DMA時(shí),相應(yīng)bsp里drv_dma.h文件中含有dma_subperipheral_enum報(bào)未定義錯(cuò)誤的原因?

    GD32F3使用串口DMA時(shí),相應(yīng)bsp里drv_dma.h文件中含有dma_subperipheral_enum,報(bào)未定義錯(cuò)誤
    發(fā)表于 07-12 08:55

    SDF工程編譯報(bào)錯(cuò)未定義是怎么回事?

    調(diào)用例程頭文件中xSemaphoreHandle audio_hal_lock和timer_callback編譯報(bào)錯(cuò)未定義,這是什么問題 F:/embedded/esp-idf/esp-adf
    發(fā)表于 06-28 08:25