0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行

龙智 来源:jf_15970448 作者:jf_15970448 2024-06-18 12:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

MISRA C++:2023——MISRA® C++ 标准的下一个版本来了!为了帮助您了解 MISRA C++:2023相比于之前版本的变化,我们将继续为您带来Perforce首席技术支持工程师Frank van den Beuken博士的博客系列,本期为第三篇。

在前两篇系列文章中,我们向您介绍了新的MISRA C++ 标准C++简史。本文,我们将仔细研究C++中以for循环为中心的特定规则。

什么是MISRA C++:2023规则9.5.2,为什么它很重要?

MISRA C++:2023 引入了规则 9.5.2 “for-range 初始值设定项最多应包含一个函数调用”,以避免在基于范围的for语句的 for-range初始值设定项创建临时对象时可能发生的未定义行为。

要了解为什么会发生这种情况,让我们仔细看看基于C++范围的for循环。

C++中基于范围的for循环是什么?

编程中,循环用于重复代码块。当您知道要循环访问代码块的次数时,可以使用for循环。

C++基于范围的for循环是在C++ 11中引入的,作为容器迭代的简洁表示法。

传统的for循环起源于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< std::string > 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++:2023规则9.5.2 如何防范未定义行为

MISRA C++:2023规则 9.5.2 旨在防止这种情况。MISRA C++:2023引入了规则 9.5.2,该规则要求for-range-initializer应最多包含一个函数调用。

它还建议通过在range-for循环之前的单独声明中执行内部函数调用来解决此问题。例如:

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

现在,初始值设定项中只有一个函数调用,因此生命周期扩展就能达到预期效果,并且行为已完全定义。

请注意,此问题已在C++23 中得到解决,其中初始值设定项的所有临时值的生命周期都扩展到整个for语句。

使用Perforce Helix QAC强制执行MISRA C++:2023 规则

Perforce的 Helix QAC 是一款静态代码分析工具,在提供 MISRA C 和 MISRA C++ 合规性检查以及许多其他有价值的分析功能方面处于领先地位。

Helix QAC通过其标准的合规模块为 MISRA C++:2023 规则提供 100% 的执行覆盖率,该模块现已推出。通过静态分析工具Helix QAC可查找并报告C和 C++中违反MISRA规则和指令的行为。

- END -

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

作者简介:

Frank van den Beuken,首席技术支持工程师

作为技术支持专家,Frank 在集成 Perforce 静态源代码分析解决方案方面拥有超过 20 年的经验,可在客户软件开发环境中进行软件质量控制。近年来,他专注于为各种编译器配置静态分析。他还提供代码质量培训和咨询。Frank 在奈梅亨大学获得数学和计算机科学博士学位,研究系统规范语言。

立即了解为什么Helix QAC是 MISRA C++的最佳静态代码分析器,欢迎咨询Perforce中国授权合作伙伴——龙智:

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 静态
    +关注

    关注

    1

    文章

    30

    浏览量

    14815
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • MISRA
    +关注

    关注

    0

    文章

    22

    浏览量

    7398
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机开发功能安全中编译器

    时可以将其忽略。因此,如果不“优化”防御性代码,则必须在语法和语义上都可以实现。 未定义行为的实例也会引起意外。很容易建议应避免使用它们,但通常很难识别它们。如果存在它们,就不能保证已编译的可执行代码
    发表于 12-01 06:44

    什么是CVE?如何通过SAST/静态分析工具Perforce QAC 和 Klocwork应对CVE?

    本文将为您详解什么是CVE、CVE标识符的作用,厘清CVE与CWE、CVSS的区别,介绍CVE清单内容,并说明如何借助合适的静态分析工具(如Perforce QAC/Klocwork),在软件开发早期发现并修复漏洞。
    的头像 发表于 10-31 14:24 285次阅读
    什么是CVE?如何通过SAST/<b class='flag-5'>静态</b><b class='flag-5'>分析</b>工具<b class='flag-5'>Perforce</b> QAC 和 Klocwork应对CVE?

    C/C++代码静态测试工具Perforce QAC 2025.3的新特性

     Perforce Validate 中 QAC 项目的相对/根路径的支持。C++ 分析也得到了增强,增加了用于检测 C++ 并发问题的新检查,并改进了实体名称和实
    的头像 发表于 10-13 18:11 345次阅读
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>代码</b><b class='flag-5'>静态</b>测试工具<b class='flag-5'>Perforce</b> QAC 2025.3的新特性

    cmbacktrace移植 编译出现_sstack未定义怎么解决?

    移植以后出现 sstack estack stext etext,未定义,去网络上搜索相关文章后,发现keil 的链接脚本文件如下。 不知道CMB_CSTART_BLOCK_START 的值如何配置。。。
    发表于 09-25 07:56

    Simulink模型测试典型问题分享-接口定义不完整

    典型测试问题分享-接口定义不完整 问题描述: 计算模块未定义数值范围,存在越界风险。 信号未规定精度和误差范围,导致背靠背测试未通过。
    的头像 发表于 09-22 15:40 954次阅读
    Simulink模型测试典型问题分享-接口<b class='flag-5'>定义</b>不完整

    汽车软件团队必看:基于静态代码分析工具Perforce QAC的ISO 26262合规实践

    ISO 26262合规指南,从ASIL分级到工具落地,手把手教你用静态代码分析Perforce QAC)实现高效合规。
    的头像 发表于 08-07 17:33 868次阅读
    汽车软件团队必看:基于<b class='flag-5'>静态</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b>工具<b class='flag-5'>Perforce</b> QAC的ISO 26262合规实践

    汽车软件开发必看:Perforce工具链助力高效开发与功能安全的最佳实践

    无论是主机厂还是供应商,ISO 26262合规都是绕不开的课题。冗长的流程、复杂的标准是否让您的团队疲于应对?Perforce一体化工具链正是破解这一难题的钥匙!从静态代码
    的头像 发表于 08-01 10:49 844次阅读
    汽车软件开发必看:<b class='flag-5'>Perforce</b>工具链助力<b class='flag-5'>高效</b>开发与功能<b class='flag-5'>安全</b>的最佳实践

    Perforce QAC产品简介:面向C/C++静态代码分析工具(已通过SO 26262认证)

    Perforce QAC专为C/C++开发者打造,支持多种编码规范、功能安全标准(ISO 26262)等,广泛用于汽车、医疗、嵌入式开发领域
    的头像 发表于 07-10 15:57 852次阅读
    <b class='flag-5'>Perforce</b> QAC产品简介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的<b class='flag-5'>静态</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b>工具(已通过SO 26262认证)

    Helix QAC 2025.1 重磅发布!MISRA C:2025® 100%覆盖

    Helix QAC 2025.1新增功能 Helix QAC 2025.1实现了对新版MISRA C:2025®标准的 100% 覆盖,并提供对应的合规模块。此版本还扩展了对 CERT C
    的头像 发表于 05-13 16:48 1119次阅读
    Helix QAC 2025.1 重磅发布!<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2025® 100%覆盖

    MISRA C:2025新标准解析:新增规则、优化点与静态代码分析工具支持(Perforce QAC、Klocwork)

    MISRA C:2025®发布!新增5条规则,并对部分现有规则进行了扩展、重组,以进一步简化安全关键型系统的开发流程。如何实现最新MISRA合规性?
    的头像 发表于 05-08 17:58 1857次阅读
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2025<b class='flag-5'>新标准</b>解析:新增规则、优化点与<b class='flag-5'>静态</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b>工具支持(<b class='flag-5'>Perforce</b> QAC、Klocwork)

    代码静态测试工具Perforce QAC 2025.1新特性

    Perforce QAC 2025.1实现了对新发布的MISRA C:2025®标准的100%覆盖,并提供了对应的新合规模块。该版本还扩展了对CERT
    的头像 发表于 04-21 15:14 924次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>静态</b>测试工具<b class='flag-5'>Perforce</b> QAC 2025.1新特性

    Perforce品牌及产品名更新:涵盖版本控制Perforce P4(原Helix Core)、静态代码分析Perforce QAC(原Helix QAC)等

    Perforce推出全新P4平台及P4 One客户端!从广为人知的“P4”到Helix Core到Perforce P4,此次品牌重塑是一次初心回归,也是对开发者和数字创作团队需求的深度回应。一起来了解更多吧~
    的头像 发表于 03-28 15:04 1108次阅读
    <b class='flag-5'>Perforce</b>品牌及产品名更新:涵盖版本控制<b class='flag-5'>Perforce</b> P4(原Helix Core)、<b class='flag-5'>静态</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b><b class='flag-5'>Perforce</b> QAC(原Helix QAC)等

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码
    发表于 03-06 06:22

    缓冲区溢出漏洞的原理、成因、类型及最佳防范实践(借助Perforce 的Klocwork/Hleix QAC等静态代码分析工具)

    本期来认识软件漏洞的“常客”——缓冲区溢出,C/C++开发者尤其要注意!全面了解该漏洞的成因、类型、常见示例,以及如何借助Klocwork、Helix QAC等SAST工具进行防护。
    的头像 发表于 03-04 16:39 1719次阅读
    缓冲区溢出漏洞的原理、成因、类型及最佳<b class='flag-5'>防范</b>实践(借助<b class='flag-5'>Perforce</b> 的Klocwork/Hleix QAC等<b class='flag-5'>静态</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b>工具)

    基于OpenHarmony标准系统的C++公共基础类库案例:Semaphore

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础类库的线程处理:Sempahore。本案例完成如下工作:(1)无名信号量使用方法定义1个无名信号量,1个供无名信号量管理
    的头像 发表于 02-10 18:08 632次阅读
    基于OpenHarmony<b class='flag-5'>标准</b>系统的<b class='flag-5'>C++</b>公共基础类库案例:Semaphore