MISRA C++和AUTOSAR C++的合并:软件开发行业专家的圆桌讨论
汽车工业软件可靠性协会(MISRA)宣布了MISRA C++和AUTOSAR C++的未来合并,这两种领先的安全性至关重要的C++编码标准。这对标准用户意味着什么,这将对组织实现合规性产生什么影响?
我们在Parasoft召集了一组行业专家,以圆桌会议的形式讨论了MISRA C++的未来以及该新的合并标准带来的预期影响和收益。
参加者是:
- Andrey Madan,Parasoft首席解决方案架构师
- Piotr Pepek,Parasoft C/C++test的软件开发经理
- Michal Rozenau,Parasoft的项目主管软件工程师,MISRA C和C++ WG成员
- Miroslaw Zielinski,Parasoft C/C++test产品经理
圆桌讨论
如今如何使用MISRA C++和AUTOSAR C++标准,以及您在汽车行业遇到的一些普遍问题是什么?
Mirek:尽管这两个标准都起源于汽车,但我们经常看到它们不仅用于汽车ISO 26262,而且还用于IEC 61508(工业自动化标准)、医疗设备和IEC62304。因此,当我们谈论MISRA和AUTOSAR时,它不仅适用于汽车行业。
就问题而言,根据我与多个行业的不同客户合作的经验,我想说,遵守编码标准最困难的部分是:
- 在团队的静态分析工具中设置标准
- 第一次分析后的初始阶段
- 处理大量违规
成功肯定取决于将标准引入组织的方式,建立合规性流程对于成功采用任何功能安全标准(包括这两个标准)至关重要。
Andrey:我绝对同意。对于MISRA C++和AUTOSAR C++规则使用静态分析,我们看到的一个常见问题是报告的违规数量。如果打开所有规则,则将有很多违规行为,而且我的意思是很多,尤其是对于遗留代码库而言。
因此,现在,我认为大多数客户正在采用的方法试图找到中间立场。并非所有规则都是强制性或必需的。因此,他们需要制定一个良好的流程。例如,他们运行一些检查器,并对代码进行一些分析,找出适用于其开发和记录该子集的规则的子集。他们知道他们不需要遵守所有规则,他们只需要有理由说明为什么不使用该规则,将其记录下来就可以了。
一旦了解了流程,他们就进行了分析,甚至积压了数千个警告,这些客户在一些点上可以划清界线,继续积压问题,以期与他们联系并解决这些问题。
Michal:是的。我认为,在此奋斗的另一个原因是,对于那些试图最终实现与MISRA之类的编码标准的合规性的公司,即使他们开始开发新的代码,他们也在寻找最终的合规性。而不是从头开始。起步较晚是他们可能首先遇到大量违规行为的最大原因之一。
是什么导致组织无法在实践中强制执行这些编码标准?
Andrey:许多组织实际上已经在使用自己的内部编码标准,该标准已经在内部开发并使用了多年。这些公司都有内部文件和遵循的政策,它们需要进行现代化以达到MISRA之类的标准,但是公司发展势头很大,需要很长时间进行更改。
这些组织的策略是解决违规问题,查看自己的编码标准,然后将Parasoft静态分析检查器映射到他们自己的编码标准,同时还要检查需要针对MISRA更新C语言其自身编码标准并更新其代码的地方。
对于C++,由于较旧的编码标准,当前情况实际上更糟。它们不支持新的语言结构(例如自动指针)以及新的现代C++引入表中的其他内容,因此该过程更加耗时。
Mirek:我提到我们看到AUTOSAR C++和MISRA C++经常被用作功能安全标准(例如ISO 26262和IEC 61508)的合规过程的一部分。要遵守这些功能安全标准,需要有纪律的开发过程,其中包括准备文档。客户需要一种方式来正式证明他们符合功能安全标准以及编码标准,这是功能安全符合性过程的一部分。
借助MISRA C++和AUTOSAR C++,Parasoft工具为合规性过程的这一正式方面提供了专门的支持。我们的报告框架会生成符合MISRA Compliance:2016“实现MISRA编码准则的遵从性”文档中定义的要求的特殊文档。最终变得非常重要。试图达到标准要求的客户可以通过使用Parasoft工具来自动执行遵从过程的这一部分。
Piotr:从采用和执行标准的角度来看,还有一件事是,标准本身也为规则提供了一些分类机制,这极大地帮助组织引入了标准。例如,对于MISRA C++,准则有不同的类别(强制性、必需和建议性)。AUTOSAR C++集合也是如此,并且还有一些其他分类框架。从最关键的类别开始,清理代码,然后再进一步,该机制还可以用于简化整个实现过程,并基本上帮助人们分阶段进行。
从这些标准开始的组织是否了解分类和优先级的重要性?
Andrey:组织并不一定要考虑这一点。作为解决方案架构师,我得到的最大要求是:“好吧,Parasoft,我们看到您有成千上万的规则,并且我们拥有庞大的代码库。帮助我们选择规则,以帮助我们发现真正的错误,实际上找到有趣的东西,有价值的东西以及值得修复的东西。”
在这一点上,我们要退后一步来确定其具体目标是什么。但是,我们经常看到客户开始时的选择更为广泛,因为尽管需要遵守编码标准,但他们没有时间仔细研究所有规则并进行分析。这就是分类和一般优先级的来源。
我们还可以询问团队管理人员,例如,是否遵循所有必需和强制性规则,他们是否需要强硬方法来遵守法规。在大多数情况下,管理层不会划清界限,而是将决定权交给工程师,他们的工程师“足够聪明”以找出需要遵守哪些规则。期望开发团队将记录他们为什么打开或关闭规则的理由。
因此,从这个角度来看,我还没有看到人们实际上在“强制执行”。这更多是一种教育方法。例如,当我解释有必需和强制性规则时,您可以偏离规则(但必须按照MISRA 2016合规性文档中的说明进行记录),实际上,这对于很多人来说是大开眼界的人。根据我的经验,在这个领域中肯定有学习曲线,需要咨询。
Mirek:我同意。我们不仅在汽车行业,而且在其他对安全性要求较高的组织中也都迫切需要获得咨询服务,以更实际地执行该标准并确定实现目标的优先级。我们有几个合作伙伴可以在这个领域为我们的客户提供服务,但是显然需要获得更多的教育和执法机会。
您认为整合AUTOSAR C++和MISRA C++准则的动力是什么?是否存在某个标准或其他标准缺少的重要内容?
Piotr:合并这些标准的主要原因仅仅是为C++制定一个单一标准。从历史上看,MISRA C++ 2008是基于C++ 2003的,而MISRA C++已有近10年的历史。AUTOSAR C++最初以MISRA C++ 2008为基础,但随后在顶部添加了许多与现代C++更相关的新规则,包括C++ 11和C++ 14的功能。因此,集成这两个标准的主要动力是采取AUTOSAR C++小组所做的工作并将其转换为下一个MISRA C++标准。
MISRA C++是否已将AUTOSAR C++编码标准替换为标准?
Michal:是的,这是计划。当前版本的AUTOSAR C++中的注释将将来的增量参考由MISRA驱动的编码指南。因此,正如Piotr所说,我们可以考虑将AUTOSAR C++作为基于MISRA C++的MISRA C++标准的更新版本,并从MISRA中直接提取了许多规则。其中一些规则已更新,并且添加了规则。因此,计划是采用这些更新的规则,并将其带回MISRA C++。
这个新的集成标准将以何种方式帮助用户?
Mirek:我认为在市场上拥有一种标准非常有价值。我们已经与许多不愿意采用合规性标准的组织进行了交谈,因为他们不确定MISRA是否会提供更新,并正在考虑采用AUTOSAR C++。因此,他们推迟了这一决定。因此,合并可以澄清这种情况,明显的好处是市场上只有一种标准,而且基本上毫无疑问可以走哪条路——新的MISRA C++标准成为合规性的主要选择。
MISRA C++和AUTOSAR C++集成会影响现有用户吗?
Mirek:肯定会有影响。例如,如果依赖于MISRA C++ 2008的组织要迁移到AUTOSAR C++,则他们必须处理大约200条新规则(因为在当前的AUTOSAR C++版本18.10中,大约45%的规则直接继承自MISRA C++ 2008) )。
因此,如果组织依赖MISRA C++ 2008,则对他们而言,迁移到AUTOSAR C++是一项巨大的工作。但是,这样做还有很大的价值,因为MISRA C++ 2008和AUTOSAR C++之间的差异解决了自2003年以来C++语言的变化。因此AUTOSAR C++中包含了C++ 11和C++ 14的所有新颖性。是的,这是有影响的,但是更新到新标准也有很多价值。
Andrey:如果客户从MISRA C++更改而他们已经符合其既定的编码标准,并且更改了标准(例如AUTOSAR C++),那么所产生的影响有时也会更加后勤。
这些客户已经在内部进行了正当化,记录在案并抑制了警告,甚至有可能通过审核。例如,假设违反了MISRA C++规则11.5,但已记录并记录了偏差。那是压制的例子,或者在这种情况下是偏差,它需要报告和文书工作。现在,如果我转到AUTOSAR C++,那么来自MISRA C++的规则可能是相同的规则,但是工具供应商将其报告为AUTOSAR C++规则17.6。这是一个不同的名称,但这是唯一的区别——仅是标签。静态分析工具将其再次标记为错误,并且忽略了抑制。禁止标记有不同的规则编号,现在它们有大量违规行为。
那么安全性呢?AUTOSAR C++以及大概新的MISRA C++是否涵盖安全性?
Mirek:好吧,主要是功能安全标准,但是安全性和安全性是相关的。两者都是关于创建没有导致无法预料的行为的构造的软件的,这意味着遵循AUTOSAR C++或MISRA C++进行功能安全的组织通常在安全性方面被很好地涵盖。安全是为了消除程序的不可预测性,当然,安全性也可以提高安全性。
但是像CERT这样的安全性准则更为详尽,并且包含了更多与安全性相关的准则。当前,我们在许多组织(尤其是成熟的汽车组织)中看到的是,他们选择功能安全标准作为主要来源,然后通过包括来自诸如CERT C++的安全标准的其他选定准则来增强规则集。
是否有任何动力将更高的安全性纳入这些安全关键标准中,例如合并诸如CERT C++之类的安全性标准?还是您认为公司会自己继续合并规则集?
Mirek:我个人不会很快将CERT与MISRA或AUTOSAR集成或合并。由于安全性的范围更广,而在语言子集方面则不那么严格,因此始终需要与安全性标准分开的面向安全性的标准。
因此,例如,在MISRA C++ 2008中,您有一条规则可以阻止您使用动态内存分配。如果要与MISRA C++ 2008兼容,则不能使用它。但是,对于CERT C++,这是完全可以的。您可以使用动态内存分配,并且有关于如何以安全方式进行分配的规则。
Piotr:是的,您可以在MISRA网站上找到官方文件,这些文件提供有关MISRA C 2012和CERT C之间映射的信息,例如,这些映射清楚地告诉您所缺少内容的区别。因此,开发人员可以了解有关在选择规则时要从CERT C/C++中包括哪些指南的信息。并且在AUTOSAR C++和CERT C++之间也存在可追溯性映射。我认为所有CERT C++指南中约有50%在AUTOSAR C++本身中也有类似的规则。
Mirek:另外,我认为采用这些标准在地区方面。正如我们随着MISRA的逐步采用所看到的那样,现在CERT C和C++看到了类似的模式。例如,我们在日本的客户很快就采用了最新的标准,他们似乎领先于世界其他地区。我们的日本客户是第一个比其他地区至少提前一年要求MISRA C 2012支持的客户,现在我们看到CERT C和C++的情况类似,日本汽车市场上有更多需要CERT C/C++支持的请求。
AUTOSAR C++是非常动态的标准,每年发布两个版本。频繁更新对试图实现合规性的组织有什么影响?您预见到新的MISRA C++标准会遵守此时间表吗?
重点:请记住,AUTOSAR C++准则是AUTOSAR自适应平台的一部分,因此每年的两个发行版是整个平台的发行周期。如果他们想使C++准则与平台保持同步,那么可以,这的确需要长期管理。但是不一定每个版本都会改变很多事情。
Mirek:正如我们已经讨论的那样,标准的变更存在一些问题。随着标准的频繁更改,您会遇到Andrey讨论的与物流有关的所有问题。准则更改后,客户需要更新其合规性框架,因为他们将面临所有重新报告的违规问题,而现在这些问题突然不再受到抑制。这是一个巨大的挑战,需要花费大量金钱。如果您有50、70或100个开发人员,并且在开发过程中已经引入了合规性流程,但是您对产品必须符合最新版本的标准有业务要求,那么您将面临挑战。
如果标准随着标准的重大变化而迅速发展,则客户必须以某种方式解决这一问题。通常这意味着从计划和预算中抽出额外的时间。这是一个问题,但是正如Piotr所说,我认为从长远来看,该标准将趋于稳定,并且每个版本之间的更改都不会那么重要,例如我们在AUTOSAR C++版本17.32和18.10之间的过渡中已经看到的那样。
在过去的两年中,C++语言的发展加速了。AUTOSAR C++当前基于C++ 14。对于MISRA C++相对于C++语言的发展,有什么期望?
Michal:目前,MISRA C++的下一个版本的计划是合并AUTOSAR C++ 14,并涵盖C++ 17(该语言的当前版本)。但是,我不能说它将来会发展多快,或者这些新版本将如何发布。就个人而言,我希望会为该语言的每个新版本创建一个新版本的标准,其基本思想是在标准足够成熟时对其进行更新。这样可以避免遇到基于C++ 14的AUTOSAR C++的情况,但每年仍需更改两次。
您预见到MISRA C++标准正在更新与ISO C++委员会发布该语言之间会有多长时间?
Michal:很难说,因为就AUTOSAR C++而言,标准化是在C++ 14发行之后开始的。AUTSAR C++的发布与该语言版本的发布或该语言的出现无关。
AUTOSAR C++从一开始就基于C++ 14。当AUTOSAR发布自适应平台时,他们发现没有涵盖C++ 14的编码标准,因此他们决定将该标准基于MISRA C++ 2008,并使用新的规则和对C++ 14的支持进行更新。
AUTOSAR C++更新是否由Adaptive Platform的发布时间表而非语言驱动?
Piotr:是的,我会这样说。
Mirek:需要指出的是,新合并的MISRA C++标准将在AUTOSAR C++之外进行更新。已经宣布将对新的集成标准进行更新,以包括在C++语言的新版本中引入的所有创新,包括C++ 17和C++ 20。对于许多组织而言,这是至关重要的。例如,现代C++功能在使用AI的系统中非常重要,这些系统依赖于最新版本的C++中经常开发的现代体系结构、现代平台和现代库。因此,声明标准将遵循语言的发展这点非常重要。