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

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

3天内不再提示

使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

北汇信息POLELINK 2024-03-28 13:53 次阅读

MISRAC++: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试用。

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

    关注

    180

    文章

    7561

    浏览量

    133302
  • 代码
    +关注

    关注

    30

    文章

    4637

    浏览量

    67624
  • MISRA
    +关注

    关注

    0

    文章

    21

    浏览量

    6943
收藏 人收藏

    评论

    相关推荐

    同一事件在不同的循环中发生,为什么只要进入别的循环就会直接动作?怎样避免

    本帖最后由 我拿吉他弹棉花 于 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>,算法,函数等

    MISRAC在安全可靠编程中的地位

    MISRA C指南的覆盖 范围上尤其竞争,因为不可能执行 MISRA C的所有16个指令和143个规则(统称为指南)。
    的头像 发表于11-23 11:55 848次阅读
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在安全可靠编程中的地位

    如何将MISRAC2023整合到您的嵌入式开发流程中

    MISRA C不是编码风格指南,而是一套规则和指令,用于最小化或消除已知危险的编码实践。鉴于对安全和安保关键型系统的这种重要性,AMD4 和 MISRA C
    的头像 发表于05-04 09:58 2342次阅读
    如何将<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:<b class='flag-5'>2023</b>整合到您的嵌入式开发流程中

    西门子博途SCL: FOR:在计数循环中执行

    使用“在计数 循环中执行”指令,重复执行程序 循环,直至运行变量不在指定的取值 范围内。
    的头像 发表于07-18 10:07 8178次阅读

    静态代码分析器工具Helix QAC 2023.2: 提供 100% 的MISRAC:2012 和MISRAC2023规则覆盖率

    Helix QAC 2023.2 提供 100% 的 MISRA C:2012 和 MISRA C2023规则覆盖率,并更新相应的合规性
    的头像 发表于07-31 22:53 964次阅读
    静态代码分析器工具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®标准的信息:MISRAC++2023®简介

    MISRA C++2023®是广受期待的 MISRA C++®标准的下一个版本,将于今年晚些时候发布。新版本将整合AUTOSAR
    的头像 发表于08-25 18:06 1121次阅读
    您需要了解的有关下一个<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%覆盖MISRAC++:2023®规则

    Helix QAC 2023.3预计将于 2023年第四季度发布的新 MISRA C++®指南,将100%覆盖 MISRA C++:
    的头像 发表于11-08 18:37 395次阅读
    静态代码分析工具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 360次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

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

    MISRA C++2023—— MISRA® C++标准的下一个版本来了!为了帮助您了解 MISRA
    的头像 发表于06-18 12:57 160次阅读

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式软件的世界,您可能听说过安全关键系统的 MISRA编码准则和合规性。最初为在汽车嵌入式软件行业, MISRA Cfor CC++
    发表于08-08 15:54 0次下载