查看: 96|回复: 0

编程规范之 AUTOSAR C++

[复制链接]

2

主题

6

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-21 16:48:08 | 显示全部楼层 |阅读模式
AUTOSAR 组织全称为 AUTomotive Open System ARchitecture,即汽车开放系统架构。该组织成立于2003年,是一个由整车制造商、OEM制造商、半导体制造商、软件供应商和工具供应商组成的的技术联盟。该组织旨在为汽车电子控制单元(ECU)软件开发建立一个开放和标准化的体系结构。

目前,该组织成员包括:大众集团、宝马集团、福特集团、丰田集团、PSA集团等几乎所有的大型整车厂商,博世、西门子、松下、三星、NEC、LG、蒂森克虏伯等基础工业产商,NXP、Intel、ARM等半导体厂商,以及黑莓、MathWroks、华为、百度等相关IT厂商。
随着近些年的蓬勃发展,该组织指定的相关架构标准已成为了事实上的行业标准。
<hr/> 01 AUTOSAR整体介绍


在内容上,AUTOSAR标准目前共分为五个部分,包括经典平台(CLASSIC PLATFORM)、自适应平台(ADAPTIVE PLATFORM)、基础标准(FOUNDATION)、面向经典平台的测试(ACCEPTANCE TESTS FOR CLASSIC PLATFORM)和应用接口(APPLICATION INTERFACE)。
其中最主要的是其基础平台,它决定了整个车载软件系统的完整架构。该平台分为早期的经典平台和后期的自适应平台。
经典平台

AUTOSAR 的经典平台架构在最高抽象级别上将微控制器运行的软件划为三层:应用程序层、运行时环境(RTE)和基本软件(BSW)。


不同软件层分别有以下特点。

  • 应用软件层基本都独立于硬件。
  • 应用软件组件与基本软件之间的通信和访问通过运行时环境。
  • 运行时环境包含应用程序需要使用的完整接口。
  • 基本软件主要分为复杂驱动和三个层次的软件:服务、ECU抽象和微控制器抽象。
  • 基本软件的服务可进一步划分为功能组,主要包括系统、内存和通信等功能组。
自适应平台

随着车载嵌入式软件的发展,经典平台已不能很好满足新的需求,为此AUTOSAR提出了新的自适应平台。
该平台实现了 AUTOSAR自适应应用的运行时环境(ARA)。该运行时环境对上层应用提供了服务和API这两种类型的接口。
该平台由按业务分组的功能集群和自适应基础设施组成,如下图。


AUTOSAR自适应平台基础设施中的功能集群必须在每个底层运行实体(虚拟机、容器或硬件)上至少有一个实例,而服务可以分布在车内网络中。
与AUTOSAR经典平台相比,自适应平台的AUTOSAR运行时环境在运行时动态链接服务和客户端。
<hr/>02 AUTOSAR C++ 编程规范

在AUTOSAR的经典平台中,车载软件系统不使用操作系统,应用程序由C语言编写。而在后来的自适应平台中,车载系统使用基于POSIX(Portable Operating System Interface)操作系统,应用程序可以由C++语言来编写。
但是由于在车载软件开发领域中,早期的编程规范主要聚焦C语言。因此,为了保证自适应平台应用程序的可靠性与稳定性,AUTOSAR组织开始着手制定车载软件领域的C++编程规范。
该指南全称为“Guidelines for the use of the C++14 language in critical and safety-related systems(关键及安全相关系统 C++ 14 语言使用指南)”
在规则内容方面,AUTOSAR C++指南完全继承了MISRA C++的范围、分类方式、规则描述方式以及大部分规则,可以看作是MISRA C++编程规范的一个改进版本。指南中的原文描述是“This document is defined as an update of MISRA C++:2008”。
与MISRA C++相比,AUTOSAR最大的区别就是增加了对C++11和C++14的支持,并基于最新的C++编程实践,改进了MISRA C++指南中不合适的规则。
版本发展

2017年3月,AUTOSAR C++编程指南第一个版本发布。
2017年10月,该指南第二个版本发布。第二版主要有以下三点改进:

  • 增加了针对HIC、Cert C++和C++核心等指南规则的映射
  • 增加了针对MISRA编程指南的内容
  • 针对已有规则中的问题进行了修订
2018年3月,指南第三版发布。该版本主要有以下几点改进:

  • 借鉴JSF、HIC、Cert C++和C++核心等编程规范,添加新的规则
  • 提升已有规则描述
  • 增加针对智能指针的规则
  • 重构针对异常的定义和规则
2018年10月,指南第四版发布。该版本主要有以下几点改进:

  • 增加了针对 ISO 26262相关内容的映射
  • 进一步基于C++核心指南增加相关规则
  • 完成针对MISRA编程指南的修订
2019年,MISRA组织宣布C++ 编程规范将在未来和AutoSar C++编程规范进行合并。
语言特性子集

为了保证C++语言在安全攸关系统中使用的可靠性,AUTOSAR C++编程规范对C++语言的特性进行了限制,禁止一些可能会引入安全问题的特性,具体内容如下表:
分类语言特性新引入可用禁用
Language independent issues
Dynamic memory managementX
Floating-point arithmeticX
General
Operators new and deleteX
malloc and free functionsX
Sized deallocationC++11X
Lexical conventions
NamespacesX
Basic Concepts
Fixed width integer typesC++11
Standard Conversions
Nullptr pointer literalC++11X
Expressions
C-style castsX
const_cast conversionX
dynamic_cast conversionX
reinterpret_cast conversionX
static_cast conversionX
Lambda expressionsC++11X
Binary literalsC++14X
Statements
Range-based for loopsC++11X
goto statementX
Declaration
constexpr specifierC++11X
auto specifierC++11X
decltype specifierC++11X
Generic lambda expressionsC++14X
Trailing return type syntaxC++11X
Return type deductionC++14X
typedef specifierX
using specifierC++11X
Scoped enumerationsC++11X
std::initializer_listC++11X
asm declarationX
Declarators
Default argumentsX
Variadic argumentsX
List initializationC++11X
Classes
UnionsX
Bit-fieldsX
Derived Classes
InheritanceX
Multiple inheritanceX
Virtual functions
override specifierC++11X
final specifierC++11X
Member Access Control
friend declarationX
Special Member Functions
Defaulted and deleted functionsC++11X
Delegating constructorsC++11X
Member initializer listsX
Non-static data member initializerC++11X
explicit specifierX
Move semanticsC++11X
OverloadingX
User-defined literalsC++11X
Digit sequences separatorsC++14X
Templates
Variadic templatesC++11
Variable templatesC++14
Exception Handling
ExceptionsX
Function-try-blocksC++03X
Dynamic exception specificationX
noexcept specifierC++11
Preprocessing Directives
Static assertionC++11X
Implementation defined behavior control (#pragma directive)X
规则分类

针对每条规则,指南会从应遵守级别、静态分析工具可检测性和应用对象等角度进行分类。
遵守级别分为:要求级(required)和建议级(advisory)。在MISRA C指南中,遵守级别分为三级,依次为强制级(mandatory)、要求级(required)和建议(advisory),而AUTOSAR C++指南中没有强制级。
在内容上,AUTOSAR C++指南的要求级与MISRA C中的强制级对应;建议级约等于MISRA C指南的要求级,不同是允许在特定场景下可以不遵守。
静态分析工具可检测性分为:可自动、半自动和无法自动三类。其中可自动是指代码是否符合该规可以由静态分析工具完全自动地进行判定;半自动是指静态分析工具的分析结果仅能作为人工代码检视的辅助信息;无法自动是指静态分析工具无法针对该规则进行分析。
该指南中大部分规则都是可自动的。
应用对象分为:实现(implementation)、验证(verification)、工具链(toolchain)和基础设施(infrastructure)。其中实现是指该规则针对代码的设计和编码过程;验证是指该规则针对代码的验证过程,如测试、代码检视等;工具链是指该规则针对软件的构建工具,如编译器、连接器和调用库等;基础设施是指该规则针对软件所运行的基础,如操作系统和底层硬件等。

在内容上,AUTOSAR C++编程指南将规则分为包括语言无关(Language independent issues )、通用(General)、词法约定(Lexical conventions)等27个类型。
所有类型规则按照遵守级别统计如下表:
要求(required)建议(advisory)总计
Language independent issues20222
General617
Lexical conventions21324
Basic concepts17219
Standard conversions707
Expressions54660
Statements25227
Declaration29130
Declarators22325
Classes808
Derived Classes11314
Member access control404
Special member functions18220
Overloading11112
Templates639
Exception handling34236
Preprocessing directives16117
Library introduction707
Language support library28028
Diagnostics library101
General utilities library707
Strings library101
Containers library202
Algorithms library404
Input/output library415
总计36333396
命名规则与继承关系

在规则命名方面,AUTOSAR C++标准的规则名称以‘M’和‘A’开头,格式为“MX-X-XX”和“AX-X-XX”。
但是文中并没有对这两种命名规则的解释。在仔细研究原文之后,发现也许问题出在这里:


5.1.1节内容的结尾“perspective”单词后面是一个“:”,但是之后就再也没有相关的内容。根据反复确认,笔者使用的确实是从官网下载的正式版本,这个地方可能确实是官方文档的一个错误。
结合原文内容“本文档的规则部分可以视为是MISRA C++:2008的一个增量。所以,规则可以分为两类:”,
,捕手君猜测这里的两类应该是指保持(Maintain)和增加或修改(Add或Amend),正好与规则命名的‘M’和‘A’对应。
经过对《MISRA C++:2008》的查阅,证实了捕手君的这个假设。目前捕手君还没有看到相关的勘误,如果大家看到相关资料请欢迎交流。
根据上文分析的规则命名方法,捕手君进一步发现,在所有396条规则中,有144条是完全继承了MISRA C++标准,有252条是修改或增加,继承比例为36.36%,由此看来AUTOSAR C++编程规范虽然自称为是MISRA C++ 编程规范的“update”,但确实在原有基础上进行了大量修改。
通过进一步分析,捕手君发现一些部分对MISRA C++的继承度非常低,应该是在MISRA C++基础上做了非常大的改进,甚至可能是整体增加,而有些部分继承率较高。
捕手君整理了相关数据,按照继承率由低到高如下表:
所属部分修改或新增继承继承率
Overloading1200.00%
General utilities library700.00%
Strings library100.00%
Containers library200.00%
Algorithms library400.00%
Special member functions1915.00%
General6114.29%
Language support library23517.86%
Declarators20520.00%
Input/output library4120.00%
Lexical conventions19520.83%
Templates7222.22%
Member access control3125.00%
Exception handling27925.00%
Derived Classes9535.71%
总体25214436.36%
Declaration191136.67%
Library introduction - partial4342.86%
Basic concepts10947.37%
Classes4450.00%
Language independent issues101254.55%
Standard conversions3457.14%
Expressions253558.33%
Preprocessing directives61164.71%
Statements81970.37%
Diagnostics library01100.00%
注:继承率 = 继承数量 / ( 修改或新增 + 继承数量)
通过上图可以看出,Overloading、General utilities library、Strings library、Containers library、Algorithms library和Special member functions 这几个部分的继承率都在10%以下,甚至部分继承率为0%,这些部分应该都是整体新增或是大幅修改。
同时,Language independent issues 、Standard conversions、Expressions、Preprocessing directives、Statements和Diagnostics library 这几部分继承率都在50%以上,部分超过了60%,由此可以判断这些部分与MISAR C++编程规范关系相对较为紧密。
以上就是捕手君针对AUTOSAR编程规范内容整理的资料。考虑到互联网的“速食”文化,捕手君没有针对每条规则内容进行展开,不过如果大家对其中某条规则有想法,欢迎交流。
关注缺陷捕手微信号,看程序缺陷的故事,学找BUG的本事
                                                下次再见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|八戒网

GMT+8, 2025-10-14 01:28 , Processed in 0.102682 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表