MISRA C++:2023®是备受期待的MISRA C++标准的下一个版本,预计将于今年晚些时候发布。这个新版本将整合AUTOSAR C++ 14指南,并支持最新版本的C++。
MISRA®的C和C++编码指南不仅是汽车行业的最佳标准,也是使用嵌入式系统的任何行业的最佳标准。
为了帮助您更好地了解新版本,Perforce将启动系列博客文章,带您解读MISRA C++:2023,这些文章由Perforce的MISRA专家Frank van den Beuken博士撰写,他曾参与了公众审阅。Perforce中国授权合作伙伴——龙智也将一一翻译,并在微信公众号中发布,敬请期待!
MISRA C++的当前版本发布于2008年。它为以ISO C++ 2003编写的安全相关软件的开发提供了专家指导。这套指南已经被广泛采用,并在许多安全关键项目中成为了强制遵循的准。然而,自那时以来,C++语言发生了相当大的变化,新的版本引入了新的语言功能,并且改变了现有的特性。
使用较新版本的C++语言开发的项目可能不符合MISRA C++:2008的所有规则,并且新特性可能不在其覆盖范围之内。为了给这些新版本提供指南,AUTOSAR 以 MISRA C++:2008为基础,结合其他标准的规则,为C++14制定了新的指南。MISRA C++工作组目前正在根据AUTOSAR指南对MISRA C++进行更新,以适用于C++17,但其中包括了MISRA已确立的安全相关C++开发的最佳实践。
人们对新的MISRA C++指南兴趣浓厚。然而,由于MISRA C++:2008已被许多项目采用,所以对于改用新的指南,人们也存在一些担忧。
在本系列文章中,将探讨新标准的多个方面。
C++和MISRA C++的历史
首先,文章将概述C++编程语言的历史,从1979年Bjarne Stroustrup 在贝尔实验室提出概念,到1991年开始标准化,再到目前的C++20版本。
值得注意的是,C++20中添加的一些主要功能在之前就已经讨论过了。“模块(modules)”和“概念(concepts)”就是这种情况,它们都是新功能,为并发编程的标准化功能提供库实现(library implementations)和协程(coroutines)。直到现在,并发支持才成为指南的一部分。但在之前,这些功能已经在Simula编程语言中存在,与C语言的高效性能相结合,以提供程序组织和并发支持。
然而,必须指出,MISRA C++似乎将以C++17为基础。造成这种情况的原因可能是,编译器实现者需要时间来为所有语言特性提供支持,而且这些实现还需要经过认证才能用于安全关键项目。
随着时间的推移,已经有许多不同的C++编码标准被编写出来了。不仅是前文提到的AUTOSAR指南,还有许多其他流行的编码标准在使用中。在今年的《汽车软件开发状况报告》中,介绍了400位汽车开发专业人士对于汽车软件行业当前实践和新兴趋势的问题的回答。随着电动汽车和半自动驾驶汽车的持续发展,以及随之而来的软件组件的增加,研究结果继续表明,安全性与防范性同样重要,并且是人们关注的主要问题。遵守安全标准的要求越来越高,也反映了这一点。
该报告还显示,仍然是汽车行业最流行的编码标准,42%的受访者使用MISRA编码标准。鉴于MISRA的悠久历史及其在汽车行业的深厚根基,这就不足为奇了。AUTOSAR以36%的比例位居第三。C++核心指南标准令人惊讶地排在第二位,占比39%,尽管该标准与汽车行业没有明显的关系。它之所以受欢迎,可能是因为它涵盖了开发人员想要使用的最新C++语言特性。
您目前正在使用哪些编码标准?
△《2023 年汽车软件开发状况报告》对于此问题的回应
C++编码标准的方方面面
由Bjarne Stroustrup和Herb Sutter发起的C++核心指南是一份不断改进的动态文件。由于该标准涵盖了最新的C++语言功能,所以也影响着AUTOSAR标准的制定。AUTOSAR包括了两个标准之间的比较,显示C++核心准则中有30%与AUTOSAR规则存在冲突。MISRA C++:2023涵盖了大部分AUTOSAR的问题,并且新的指南没有直接使用C++核心准则。
Perforce将提供一篇专门的文章,全方位比较这些C++编码标准,包括理念、指南、执行和声明合规性。由于MISRA C++:2023似乎不太可能整合所有的AUTOSAR规则,所以Perforce将评估与新MISRA C++:2023规则中与C++核心指南冲突的比例,并将其与AUTOSAR进行比较。
MISRA C++:2023的新准则
最后,还将有一些介绍新准则的文章。
MISRA C++:2023将提供定义类类型接口的指导规则。它提倡“规则0(Rule of Zero)”,这意味着它更倾向于不指定特殊成员函数,因为语言标准保证了编译器已经提供了预期的实现。
这与其他建议如“规则5”(或“规则6”,如果您还单独计算默认构造函数的话)相矛盾,后者规定您需要始终明确指定特殊成员函数。Perforce将讨论新规则如何处理现有指南所涵盖的漏洞。
不过,这也存在风险,从为AUTOSAR规则A12-0-1提供的合规示例中就可以看出:
class A // Compliant - the class A follow the "Rule of six" rule
{
public:
A(); // Non-default constructor
~A() = default;
A(A const&) = default;
A& operator=(A const&) = default;
A(A&&) = delete;
A& operator=(A&&) = delete;
};
可以看到,只有移动函数(move functions)被删除了,而复制函数和析构函数被设置为默认。这样的代码可能是开发人员遵循“规则3”到“规则5”的代码进行扩展的结果,但开发人员试图通过删除新的移动函数来保留旧的行为。MISRA C++不允许这种特殊成员函数的组合;如果一个类提供了复制函数,那它必须同时提供移动函数。这个类的问题在于,它不能与容器一起使用。例如,当尝试声明一个该类型的向量时,由于缺少移动函数,会发生编译错误。需要注意的是,这个示例在AUTOSAR标准的18-03版本中得到了修正,规则的措辞也发生了变化,但并没有明确要求在提供复制函数时必须提供移动函数。
MISRA C++:2023将包括限制使用标准类型转换的指南。熟悉MISRA C:2012的开发人员可能期望有类似的类型转换规则,就像MISRA C基本类型定义的规则一样,但情况并非如此。
MISRA C++:2023要严格得多。原因是:与C不同,C++提供了函数重载,这取决于表达式的确切类型和自动占位符类型说明符,其中类型是从表达式派生的。如果不遵守规则,可能会出现这样的情况:包含头文件的函数重载比之前的函数重载匹配得更好,这可能是意料之外的。有一种安全的方法可以避免隐式转换,那就是使用具有整数基础类型的类型安全枚举类型。这种强类型的值不会被隐式转换。
Perforce的Helix QAC是一款静态分析工具,在提供MISRA C和MISRA C++合规性检查以及许多其他有价值的分析功能方面处于领先地位。
Helix QAC提供了合规模块,用于强制执行MISRA C和MISRA C++的所有版本和修订,包括MISRA C:2023。Perforce计划在标准发布时,提供完整的MISRA C++:2023合规性模块。
作者简介:
弗兰克-范登博肯(Frank van den Beuken)
首席技术支持工程师,Perforce
作为技术支持专家,弗兰克在集成Perforce静态源代码分析解决方案以进行软件质量控制方面拥有超过20年的经验,服务于客户的软件开发环境。近年来,他专注于为各种编译器配置静态分析。他还提供代码质量培训和咨询服务。
Frank拥有Nijmegen大学数学与计算科学博士学位,研究领域为系统规范语言。
文章来源:https://bit.ly/3PS2wat