本帖最后由 北汇信息 于 2022-11-14 10:09 编辑

当飞鸟遇上游鱼,当溪流遇上江海,当北京遇上西雅图,当你遇上Mr/Ms.Right…,“当”是一切美好的开端,但今天,咱先不聊自然也不聊爱情,聊一聊当C++遇上AUTOSAR编码规范,会有一段怎样的故事?
107_01.png
AUTOSAR与静态代码测试
汽车界的同仁们都知晓,AUTOSAR(AUTomotiveOpen System ARchitecture)组织拥有超过180个会员,涵盖了汽车整车厂、零部件供应商、工具供应商、半导体芯片供应商等,这样的强强联合,开发了一套针对汽车ECU的开放式软件体系架构,实现了应用层和底层的解耦,标准化软件基本元素、接口及总线系统,使汽车行业能够在控制成本的同时,更好地应对系统复杂度不断增长的情况。
AUTOSAR组织开发的第一个开放式架构称为“Classic Platform”,该架构的开发以C代码为主体,在做代码静态测试时,应用MISRA C 2012足以。但随着智能化的普及,为了满足车联网及无人驾驶技术的发展需求,AUTOSAR组织推出新架构“Adaptive Platform”,Adaptive Platform的相关API接口由C++语言进行开发。那么问题来了,我们是否可以直接遵循MISRA C++编码规范?


MISRAC++编码规范
许多安全关键性系统开发者结合已经建立的编码规范,典型如MISRAC++2008,来使用C++03语言标准,这无可厚非,MISRAC++2008的制定基础即为C++03。但C语言在持续更新,编译器也随之而变,这就意味着帮助开发人员编写安全可靠的代码的编码标准同样需要持续更新以保证新语言特性的最佳实践应用。
为此在2017年,AUTOSAR组织基于C++14标准发布了新的编码准则——AUTOSAR Coding Guidelines,这一准则是MISRA C++2008的延伸,它为应用现代C++语言编写安全和任务关键型嵌入式系统提供了有效指导。
其实AUTOSAR编码标准与MISRA C++2008存在高度的共性,在处理新语言特性的使用上存在少量差异,所以如果我们采用了合适的自动代码静态分析方案,完成MISRA C++2008到AUTOSAR Coding Guidelines的迁移并不是一件难事。

AUTOSARCoding Guidelines和现有编码规范的区别和联系
这应该是广大开发人员比较关心的一部分,用两个成语来概括AUTOSAR Coding Guidelines:兼容并蓄、独树一帜。因为它涉及了一系列已有的编程标准,又根据Adaptive Platform制定了独有的规则。2018年3月,AUTOSAR Coding Guidelines发布了402条规则,其中138条直接取自MISRAC++2008。
此外AUTOSAR还引用了如下编码标准:
l  Joint Strike Fighter Air VehicleC++ coding standards (JSF AV C++)
l  High Integrity C++ codingstandard Version 4.0 (HICPP)
l  CERT C++ coding standard (CERT)
l  C++ Core guidelines (C++ CORE)
l  Google C++ Style Guide

在AUTOSAR编码标准中,有“对已有编码标准的可追溯性”的章节,它详述了MISRA,HICPP,JSF,C++ Core guidelines,和CERT编码规则与AUTOSAR编码标准的关联度,并分成如下几类:“完全相同”、“微小差别”、“显著差别”、“不采用”,详见下表:

107_02.png

AUTOSAR Coding Guidelines吸收了约91%的MISRA C++2008规则,就如AUTOSAR编码规范Section 1所述:'This document is defined as an update of MISRA C++:2008 … MISRA C++:2008 is required prerequisite for the readers of thisdocument.’。AUTOSAR Coding Guidelines是站在各位“巨人”的肩膀上推动AUTOSAR架构下汽车软件的发展和进步。

开发团队应该采用AUTOSAR编码规范吗?
很多人可能存在这样的疑问:能不能用MISRAC++2008测试C++14的代码?是否有必要采用AUTOSAR Coding Guidelines?
严格来讲,使用C++14编译器编译的代码是不能遵从MISRA规范的。如果用MISRAC++2008测试C++14的代码,就肯定会出现违反项,我们需要对每一项违反进行说明,并用其他方法再一次检查违反项代码。换句话说,是有可能证明C++14代码符合MISRA规范的,但过程很艰苦。AUTOSAR Coding Guidelines帮助开发人员摆脱了这种复杂情况。
所以,开发团队采用AUTOSAR编码规范是毋庸置疑的。不仅如此,如果您的项目需要按照C++14编码并且需要说明该项目符合ISO26262功能安全标准,那么AUTOSAR编码规范就是无可替代的,因为在AUTOSAR编码规范之前没有其他的编码标准是为了支持符合C++14编写的安全关键型软件而设计的。
下表是各编码规范支持的C++语言版本:
107_03.png

如何实现从已有编码规范到AUTOSAR的转变?
答案很简单,按照AUTOSAR规范提示,修改源码。前提是您选择了靠谱的代码静态测试工具,才能得到精准的规范诊断信息,比如Helix QAC。在Helix QAC中,可以直接加载AUTOSAR编码规范,自动执行代码静态检测。

107_04.png

如果您已经遵循了MISRA编码规范,那意味着您已经完成了大部分工作,但不可避免的,在应用代码静态测试分析器做AUTOSAR规范检查时,分析器会在符合MISRA规范的代码里找到违反项,因为AUTOSAR编码标准引入了针对C++11/14特性的规范。这时候该举个例子了,比如:
Rule A8-5-2: Braced-initialization {}, withoutequals sign, shall be used for variable initialization
在C++03的初始化中,是这样写的:
int 32 x1=0;
而AUTOSAR规范中不再兼容这种表达,取而代之的,是
std : : int32_t x1{0};
再比如:
std : :int8_t c1=400; //ok?
std : :int8_t c2 {400}; //error:
narrowingconversion
这种初始化方式防止了缩小转换,提高了代码安全性,是C++新特性最佳实践应用的代表,然而这种规则检测MISRA C++是不支持的。
另外一个例子是:
Rule A3-9-1:Fixed width integer types from <cstdint>, indicating the size andsignedness, shall be used in place of the basic numerical types
这条规则取代了MISRA C++ Rule 3-9-2,MISRA C++依赖于用户或执行时定义的类型,而AUTOSAR则使用ISO C++标准中定义的类型。
其实说到这里,大家对AUTOSAR Coding Guidelines肯定有了更新的认识和判断。AUTOSAR编码规范之所以被应用,是因为在AUTOSAR架构下找不到合适的编程标准去指导现代C++(C++11/14)语言在安全关键性软件上的应用,典型如Adaptive Platform软件架构。现代C++提供了很多很有帮助的语言特性,当联合AUTOSAR编码规范一起使用时,可以帮助您提高代码的可读性,为嵌入式系统软件安全保驾护航。
这样看来,当C++遇上AUTOSAR编码规范,不失为汽车行业的一件大事。

如何开启浪漫的邂逅?
如需按照AUTOSAR编码规范进行测试,可联系北汇信息进行试用申请。北汇信息作为Perforce(PRQA)公司的合作伙伴,将为客户提供优质的静态代码测试工具和服务。
Perforce(PRQA)公司是AUTOSAR组织在代码静态分析领域的唯一会员,负责功能安全软件架构的相关标准制定工作,参与编写了C++14编码指南,制定了AUTOSAR测试方案,并应用其开发的静态测试工具Helix QAC在AUTOSAR Adaptive Platform演示代码上执行代码静态测试。
Helix QAC作为代码静态分析领域的先驱,不仅仅提供针对AUTOSAR C++的诊断,还支持MISRA C/C++、HICPP、JSFAV C++、CERT、CWE编码规范包,其精准的诊断消息和强大的软件生命周期管理平台为全球3000多个整车厂和零部件供应商所信赖。

107_05.png