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

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

3天内不再提示

带你走近MISRA C++:2023

北汇信息POLELINK 2024-04-30 08:24 次阅读

作者 | 给你小鱼干
小编 | 不吃猪头肉

随着汽车工业迈入数字化转型的新纪元,软件的安全性与可靠性已跃升为设计和开发核心环节的重中之重。MISRA C++标准的诞生与演进,精准地回应了行业发展的需求。自MISRA C++标准首次面世以来,它便被奉为汽车软件工程师在开发实践中的圭臬。
11b82212-0688-11ef-9118-92fbcf53809c.png

MISRA C++的发展史
MISRA C++的起源可以追溯到MISRA C标准的成功制定和广泛应用。MISRA C是一套针对C语言的编码规范,首次发布于1998年,它迅速成为汽车行业中软件安全性和可靠性的标杆。(回顾MISRA C:2012介绍请见文章

带你走近MISRA C:2012》)随着C++在工业界的普及,尤其是在汽车电子控制系统中,对C++的类似规范的需求日益增长。基于MISRA C的成功经验和市场需求,MISRA组织随后发布了适用于C++03标准的编码规范MISRA C++:2008。这是首个针对C++语言的MISRA标准,包含一系列的规则和指导原则,这些规则覆盖了从编程实践到代码设计等多个方面,旨在帮助开发者编写出更加安全和可靠的代码。
MISRA C++:2008规范发布后,得到了业界的广泛认可和采纳。它不仅在汽车行业中得到了应用,还扩展到了航空、医疗设备和工业控制等多个领域,并对这些行业产生了深远的影响。随着C++语言标准的不断更新和新特性的引入,MISRA C++:2008也在经历不断的修订和更新,以保持与C++标准语言的同步,并覆盖新出现的语言特性。MISRA C++:2008与AUTOSAR C++14
但随着后续新版本C++标准的发布,MISRA C++:2008并未将新的C++语言特性纳入,于是AUTOSAR组织发布了AUTOSAR C++14编码规范。
AUTOSAR C++14在制定时,大量借鉴了MISRA C++:2008的规则。MISRA C++:2008是基于C++03标准制定的,而AUTOSAR C++14则是基于更新的C++14标准。AUTOSAR C++14吸收了约91%的MISRA C++:2008规则,并对其进行了扩展和更新,引入了针对C++11/14特性的规范。

11d8b946-0688-11ef-9118-92fbcf53809c.png

MISRA C++:2023
MISRA C++:2023发布于2023年10月,这是MISRA C++的最新版本。它为使用ISO/IEC 1488217) 开发的安全关键型软件的组织提供指导MISRA C++:2023规则分类
MISRA C++:2023整合了AUTOSAR C++14编码规范, 共179条准则。这些规则按照性质分为两类:Rule(规则)和Directive(指令),包含175条Rule和4条Directive。规则有三种不同类别:” Mandatory(强制)”、” Required(要求)”和“Advisory(建议)”, Mandatory类别的规则中包含5条Rule,Required规则中包含122条Rule和4条Directive,Advisory规则中包含48条Rule。
11feef76-0688-11ef-9118-92fbcf53809c.png图1 MISRA C++:2023规则分类
122724e6-0688-11ef-9118-92fbcf53809c.png图2 MISRA C++:2023规则类别MISRA C++:2023还引入了MISRA C++的Rule可判定性分类。可判定性区分标准为是否能在任何情况下明确回答“该代码是否遵循了这条规则?”这个问题。
123cb9fa-0688-11ef-9118-92fbcf53809c.png1257faf8-0688-11ef-9118-92fbcf53809c.png图3 Rule的可判定性分类要注意的是,可判定性并不适用于Directive规则。接下来让我们进一步了解MISRA C++:2023编码规范。

1275b16a-0688-11ef-9118-92fbcf53809c.png

什么是 MISRA C++:2023 Rule 9.5.2,为什么它很重要?MISRA C++:2023 引入了Rule 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::vectorcreateStrings() {

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 Rule 9.5.2 如何防范未定义的行为
MISRA C++:2023 Rule 9.5.2 旨在防止这种情况。MISRA C++:2023 引入了规则 9.5.2,该规则要求for范围初始值设定项最多应包含一个函数调用。
它还建议通过在循环范围之前的单独声明中执行内部函数调用来解决此问题。例如:

auto strings = createStrings();

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

现在,初始值设定项中只有一个函数调用,因此生存期扩展具有所需的效果,并且行为已完全定义。

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

    关注

    8

    文章

    8600

    浏览量

    61633
  • MISRA
    +关注

    关注

    0

    文章

    21

    浏览量

    6960
  • 汽车
    +关注

    关注

    13

    文章

    3416

    浏览量

    37164
收藏 人收藏

    评论

    相关推荐

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    C2000™ MISRA-C策略

    电子发烧友网站提供《C2000™ MISRA-C策略.pdf》资料免费下载
    发表于 10-11 11:43 0次下载
    <b class='flag-5'>C</b>2000™ <b class='flag-5'>MISRA-C</b>策略

    embOS的MISRA-C:2012一致性

    MISRA C是汽车工业软件可靠性协会(MISRA)开发的一套针对C编程语言的软件开发指南,目的是提升嵌入式系统的安全性和可移植性。2012发布的M
    的头像 发表于 08-20 11:35 421次阅读

    whitepaper-perforce-what-is-misra

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

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载

    C++中实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个
    的头像 发表于 07-18 10:16 534次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

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

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

    MISRA-C-:2004中文版

    MISRA-C-:2004 中文版
    发表于 06-04 11:52 1次下载

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

    在前两篇博客中,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客中,我们将仔细研究以 C++ 中 for 循环为中心的特定规则。
    的头像 发表于 03-28 13:53 736次阅读
    使用 <b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:<b class='flag-5'>2023</b>® 避免基于范围的 for 循环中的错误

    c语言,c++,java,python区别

    C语言、C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言: C语言是一种面向过程的编程语言。它具有底层的特性,能够对计算机硬件进行直接操作。
    的头像 发表于 02-05 14:11 2232次阅读

    汽车电子行业的MISRA C标准解读

    之前分享了一些编程规范相关的文章,有位读者提到了汽车电子行业的MISRA C标准,说这个很不错。
    的头像 发表于 01-17 11:03 1124次阅读

    代码静态测试工具Helix QAC 2023.4新发布

    Helix QAC 2023.4 为新的 MISRA C++2023 指南推出了 100% MISRA C++
    的头像 发表于 01-13 12:25 446次阅读
    代码静态测试工具Helix QAC 2023.4新发布

    C++简史:C++是如何开始的

    MISRA C++2023MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工
    的头像 发表于 01-11 09:00 535次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    C语言和C++中那些不同的地方

    C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++
    的头像 发表于 12-07 14:29 907次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b>中那些不同的地方

    c++怎么开始编程

    C++是一种高级的、通用的编程语言,用于开发各种类型的应用程序。它是从C语言演变而来,也是一种静态类型语言,可以在不同的平台上进行开发。C++具有高度的灵活性和性能,并且广泛应用于游戏开发、桌面
    的头像 发表于 11-27 15:56 893次阅读