首页 > 编程语言 >带你走近MISRA C++:2023

带你走近MISRA C++:2023

时间:2024-04-29 11:55:05浏览次数:27  
标签:std 2023 Rule MISRA C++ 规则

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

 

 

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特性的规范。

 

MISRA C++:2023

 

MISRA C++:2023发布于2023年10月,这是MISRA C++的最新版本。它为使用ISO/IEC 14882:2017定义的2017语言版本(C++:17) 开发的安全关键型软件的组织提供指导。

 

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。

 

MISRA C++:2023(179条规则)

Directive(4条)

仅分析源码无法对指令进行合规性判定,往往需要结合设计文档或开发人员经验综合判定,静态测试工具可以为指令的合规性判定提供辅助,但不同性能的工具提供的解释可能会大不相同。

Rule(175条)

仅根据规则可以对源码进行合规性检查,不需要额外的设计文档和需求规范。

 

图1 MISRA C++:2023规则分类

 

MISRA C++:2023(179条规则)

Mandatory

(5 Rules)

声称符合MISRA C++:2023的C代码应遵守所有的强制性准则,不允许背离强制性规则。

Required

(122 Rules、4 Directives)

声称符合MISRA C++:2023的C代码应该遵循所有的要求规则,如果存在违规行为,需要给出形式化的背离。

Advisory

(48 Rules)

形式化的背离对于“建议规则”不是必需的,但是,如果不遵循形式化的背离过程,应为违规行为的记录做出其他安排。

 

图2 MISRA C++:2023规则类别

 

MISRA C++:2023还引入了MISRA C++的Rule可判定性分类。可判定性区分标准为是否能在任何情况下明确回答“该代码是否遵循了这条规则?”这个问题。

 

   

MISRA C++:2023

Decidable

(156 Rules)

如果静态分析器报告了Decidable规则的诊断消息,那么说明代码的确违反了该规则;如果未报告Decidable规则的诊断消息,那么说明代码的确未违反该规则。

Undecidable

(19 Rules)

相反,Undecidable规则消息不能明确说明代码是否违反了该规则。

 

图3 Rule的可判定性分类

 

要注意的是,可判定性并不适用于Directive规则。

 

接下来让我们进一步了解MISRA C++:2023编码规范。

 

什么是 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::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 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 << " "; }

 

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

 

请注意,此问题已在 C++23 中得到解决,其中初始值设定项的所有临时项的生存期已扩展到整个 for 语句。(原文请参考《Avoiding Bugs in Range-Based For-Loops with MISRA C++:2023®》)

 

关注更多MISRA C++2023内容请见直播回放《汽车行业为何需要MISRA C++:2023》,本期课程我们联合了嵌入式静态分析领域公认的行业领导及先驱Perforce公司,并邀请到其合规总监Jill Britton女士探讨在这项汽车行业调查中的发现并介绍MISRA C++2023为何如此重要。

 

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

 

Perforce 的 Helix QAC 是一款静态分析工具,在提供 MISRA C 和 MISRA C++ 合规性检查以及许多其他有价值的分析功能方面处于领先地位。 Helix QAC 通过其标准合规性模块为 MISRA C++:2023 规则提供 100% 的强制执行覆盖率,现已推出。

 

作为Perforce公司的合作伙伴,北汇信息将为客户提供优质的静态代码测试工具和服务,欢迎您发邮件到[email protected],申请Helix QAC免费试用。

 

 

翻译

搜索

复制

<iframe height="240" width="320"></iframe>

标签:std,2023,Rule,MISRA,C++,规则
From: https://www.cnblogs.com/polelink/p/18165375

相关文章

  • C++中StringPiece了解
    转自:https://blog.csdn.net/zxpoiu/article/details/1172580471.介绍使用c++string类不可避免会带来很多不必要的拷贝,拷贝多了必然影响性能。因此在很多高性能C++框架的实现中,都会使用StringPiece类作为string类的wrapper,该类只持有目标字符串的指针,而避免额外的拷贝。class......
  • c++ 快速复习第一部份
    去年有事无事学过一c++,,由于工作用不上,学来没有用,所以学得乱七八的,最近需要复习一下,因为最近想学习一下硬件相关第一  引用头文件和自定义头#include<iostream>usingnamespacestd;//引用命名空间可以避免使用::语法intmain(){默认输出写法:std::cout<<"Hello,wor......
  • 机器学习理论问答题刷题宝典2023
    机器学习理论问答题刷题宝典机器学习理论问答题刷题宝典20231.请简要介绍下SVM。SVM,全称是supportvectormachine,中文名叫支持向量机。SVM是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。扩展:支持向量机学习方法包括构建由简至繁的模......
  • C++ 异常处理机制详解:轻松掌握异常处理技巧
    C++异常处理C++异常处理机制允许程序在运行时处理错误或意外情况。它提供了捕获和处理错误的一种结构化方式,使程序更加健壮和可靠。异常处理的基本概念:异常:程序在运行时发生的错误或意外情况。抛出异常:使用throw关键字将异常传递给调用堆栈。捕获异常:使用try-cat......
  • 寒假训练15-BCPC2023finla
    I.请问您今天要来点取模吗?题意:求L-R里所有数经过一系列取模后的值的和题解:我们考虑一个0-R的区间经过一次对x的取模,会变成(R+1)/x个0-(x-1)的区间以及可能会有尾巴上一个不完全的0-R%x的区间前面这些所有区间可以看成一个一样的东西存在数据结构中,那么q次取模只会产生q个区间,我......
  • 安全可靠测评结果公告(2023年第1号) 2023-12-26 来源: 中国信息安全测评中心
    根据《安全可靠测评工作指南(试行)》要求,现将安全可靠测评结果予以公布,自发布之日起有效期三年。   特此公告。  安全可靠测评结果公告(2023年第1号)(itsec.gov.cn) 中国信息安全测评中心国家保密科技测评中心2023年12月26日                  附......
  • 2023蓝帽杯初赛取证wp(待更新)
    2023蓝帽杯初赛取证wp(待更新)最近取证比赛好多,被迫学习(bushi初次接触取证,火眼都不会用,笑死。VC密码:Hpp^V@FQ6bdWYKMjX=gUPG#hHxw!j@M9目前只写了计算机取证部分。【计算机取证】请给出计算机镜像pc.e01的SHA-1值?[答案格式:大小写均可]23F861B2E9C5CE9135AFC520CBD849677522F5......
  • VS和jetbrains比较容易忘记的几个快捷键(更新至20230428)
    //PS:这几个是我经常忘记的,记录一下,//         暂时只记录用到的,其他的用到后再去补充添加,后面会陆续补充。 VS2022Ctrl+T :在所有代码里面搜索的快捷键,(不是Ctrl+Q)快速搜索并定位文件名称的快捷:在当前文件快速搜索函数名称的快捷键: JetBrains在所有......
  • C++编程英语词汇
    abstract抽象的abstraction抽象性、抽象件access访问accesslevel访问级别accessfunction访问函数adapter适配器address地址address-ofoperator取地址操作符aggregation聚合algorithm算法allocate分配allocator分配器application应用程序architecture体系结构argu......
  • 实验三202383310064闫忠奥
    实验一#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);voidprint_spaces(intn);voidprint_blank_lines(intn);intmain(){ intline,col......