Autosar标准解析

       AUTOSAR( Automotive Open System Architecture )——汽车开放系统架构,是一家致力于制定汽车电子软件标准的联盟(宝马、博世、大陆、戴姆勒、福特、标志雪铁龙、丰田和大众),成立于2003年,是一套标准、方法论、开发流程、软件接口,交换格式以统一的模型与方法学支撑整车软件系统设计。

AUTOSAR联盟于2017年3月发布了新版本的AUTOSAR标准,称为”Adaptive Platform”,中文翻译为“自适应平台” 。自适应平台的API是使用C++语言实现的,也决定了C++将成为自适应平台软件的主要开发语言。

       AUTOSAR组织开发的第一个开放式架构称为“Classic Platform”。开发以C语言为主,在做静态分析时,应用MISRA C:2012。

       AUTOSAR与MISRA的关系。

AUTOSAR联盟发布的指南。作为自适应AUTOSAR平台的一部分,要求在关键和安全相关系统使用C++ 14语言标准。

自适应AUTOSAR依赖于 C++ 14语言标准,是MISRA C++ 2008的(基于C++ 03)一次更新(C++ 98和C++ 03已过时),仍旧使用MISRA C++ 03被认为是违法的。偏重于功能安全(Safety), ISO 26262功能性安全标准,软件代码由AUTOSAR保证。

汽车行业已经有了广泛使用MISRA C++:2008规范,为什么还要另行发布新的规范?

1、MISRA C++:2008是基于C++ 03语言发布的,已经将近10年;

2、C++语言本身也在进化演变,例如编译器的改进、工具的进化、ISO 26262功能安全标准的发布和落地、知识库的扩展。

C++ 20太新,需要更多的测试和更好的支持才能用于安全关键性软件开发。

目前, AUTOSAR和MISRA联手制定适用C++ 17的安全编码指南,并计划持续到C++20。

AUTOSAR C++14遵循MISRA C++ 2008中的规则分类方法,划分为必要规则和建议规则,去掉了强制规则。

AUTOSAR C++ 14没有就实现合规的过程提供任何类似的指导(Coverity也不产生合规性报告),但是可以参考MISRA标准。

      2018年3月,AUTOSAR Coding Guidelines发布了397条规则,其中138条直接取自于MISRA C++ 2008,另外70条做了微小或说明比较明显的修改。还引用了如下C++编码标准,且可追溯。

  • Joint Strike Fighter Air Vehicle C++ coding standards (JSF AV C++)
  • High Integrity C++ coding standard Version 4.0 (HICPP)
  • CERT C++ coding standard (CERT)
  • C++ Core guidelines (C++ CORE)
  • Google C++ Style Guide

         Coverity 2021.9版本对AUTOSAR支持的情况如下表:

         下面列出AUTOSAR的397条规则。

分类小类编号类别 规则项自动化类型支持CWEID
语言独立性问题不必要的构造器A0-1-1 必要项目不应包含被赋值但未后续使用的非易失性变量的实例。自动化563
A0-1-2 必要应使用不是重载运算符的返回类型为非 void 的函数返回值。自动化710
A0-1-3 必要在匿名命名空间中定义的每个函数、具有内部链接的静态函数或私有成员函数都应被使用。自动化1164
A0-1-4 必要非虚函数中不应存在未使用的已命名参数。自动化1164
A0-1-5 必要用于虚函数以及覆盖该虚函数的所有函数的参数集中不应存在未使用的已命名参数。自动化1164
A0-1-6 建议不应存在未使用的类型声明。自动化1164
算术A0-4-1 必要浮点实现应符合IEEE 754标准非自动化710
A0-4-2 必要不应使用类型 long double。自动化710
A0-4-3 必要所有代码都应在编译时无编译器警告自动化703
A0-4-4 建议使用数学函数时,应检查范围、域和极点误差。自动化703
通用范围A1-1-1 必要所有代码均应遵守 ISO/IEC 14882:2014 - 编程语言 C++,并且不得使用废弃的功能。自动化477
A1-1-2 必要应根据项目政策设置编制过程的警告级别非自动化 
A1-1-3 必要不应在所选编译器中启用忽略严格标准遵从性的优化选项非自动化 
规范引用A1-2-1 必要在安全相关软件中使用编译器工具链(包括预处理器、编译器本身、链接器、C++标准库)时,应确定工具置信水平(TCL)。对于TCL2或TCL3,编译器应根据ISO 26262-8.11.4.6[6]进行“软件工具鉴定”。非自动化 
实施合规性A1-4-1 必要应定义代码度量及其有效边界,代码应符合代码度量的定义边界非自动化 
A1-4-3 建议所有代码都应在编译时无编译器警告自动化 
词汇约定字符集A2-3-1 必要应在源代码中使用在 C++ 语言标准基本源字符集中指定的字符。自动化1076
三字符序列A2-5-1 必要不应使用三字符组。自动化1078
A2-5-2 必要不应使用双字符组。自动化1078
注释A2-7-1 必要字符 \ 不应作为 C++ 注释的最后一个字符出现。自动化1113
A2-7-2 必要不应将代码段“注释掉”。非自动化1078
A2-7-3 必要“用户定义的”类型、静态和非静态数据成员、函数和方法的所有声明应在文档之后。自动化1059
A2-7-5 必要评论不得记录任何行动或来源(例如,表、图、段落等)。非自动化 
头文件A2-8-1 必要头文件名应反映其提供声明的逻辑实体。非自动化 
A2-8-2 建议实现文件名应反映其提供定义的逻辑实体非自动化 
标识符A2-10-1必要在内部范围中声明的标识符不应隐藏在外部范围中声明的标识符。自动化1109
A2-10-4必要具有静态存储持续时间或静态函数的非成员对象的标识符名称不应在命名空间中重用。自动化1109
A2-10-5建议不应重用具有静态存储持续时间的函数或具有外部或内部链接的非成员对象的标识符名称。自动化1109
A2-10-6建议同一范围内的变量、函数或枚举器声明不应隐藏类或枚举名称。自动化1109
关键字A2-11-1必要不应使用易失性关键字。自动化710
类型A2-13-1必要只应使用在 ISO/IEC 14882:2014 中定义的那些转义序列。自动化710
A2-13-2必要不应连接具有不同编码前缀的字符串常量。自动化682
A2-13-3必要不应使用类型 wchar_t。自动化710
A2-13-4必要不应将字符串常量赋值给非常量指针。自动化710
A2-13-5建议十六进制常量应为大写字母。自动化1076
A2-13-6必要通用字符名称仅应在字符或字符串常量中使用。自动化710
基本概念声明和定义A3-1-1 必要在不违反“一个定义规则”情况下可以在多个编译单元中包括任何头文件。自动化710
A3-1-2 必要在项目中本地定义的头文件的文件扩展名应为以下之一:“.h”、“.hpp”或“.hxx”。自动化1076
A3-1-3 建议在项目中本地定义的实现文件的文件扩展名应为“.cpp”。自动化1076
A3-1-4 必要在声明具有外部链接的数组时,应显式声明其大小。自动化710
A3-1-5 必要函数定义在以下条件下只应放在类定义中:(1) 函数将成为内联函数 (2) 函数是成员函数模板 (3) 函数是类模板的成员函数。Partially-自动化710
A3-1-6 建议应内联不重要访问器和修改器函数。自动化1076
范围A3-3-1 必要应在头文件中声明具有外部链接(包括已命名空间名称的成员)的对象或函数。自动化710
A3-3-2 必要静态或线程本地对象应是常量初始化的。自动化665
命名查找A3-8-1 必要不应在对象的生命周期之外访问它。非自动化416
类型A3-9-1 必要应该使用来自指示大小和符号的 <cstdint> 的固定宽度整数类型代替基本数值类型。自动化710
标准约定整体提升A4-5-1 必要不应将具有类型 enum 或 enum 类的表达式用作内置和重载运算符的操作数,以下运算符除外:下标运算符 [ ],赋值运算符 =,等号运算符 == 和 !=,一元 & 运算符以及关系运算符 <、<=、>、>=。自动化686
数据精度A4-7-1 必要整数表达式不应导致数据丢失。自动化682
指针约定A4-10-1必要只有 null ptr 常量应用作 null 指针常量。自动化1076
表达式通用A5-0-1 必要在标准允许的任何求值顺序下,表达式的值都应相同。自动化758
A5-0-2 必要if 语句的条件和迭代语句的条件都应具有 bool 类型。自动化710
A5-0-3 必要对象的声明不应包含超过两级的指针间接。自动化637
A5-0-4 必要Pointer arithmetic 不应与指向非 final 类的指针一起使用。自动化758
主要表达式A5-1-1 必要除类型初始化以外,不应使用常量值,否则应改为使用符号名称。Partially-自动化1076
A5-1-2 必要不应在 lambda 表达式中隐式捕获变量。自动化1076
A5-1-3 必要参数列表(可能为空)应包含在每个 lambda 表达式中。自动化1076
A5-1-4 必要Lambda 表达式对象不应超过任何其引用捕获的对象。自动化758
A5-1-6 建议应显式指定非 void 返回类型 lambda 表达式的返回类型。自动化1076
A5-1-7 必要Lambda 不应是 decltype 或 typeid 的操作数。自动化710
A5-1-8 建议不应在另一个 lambda 表达式中定义 lambda 表达式。自动化1076
A5-1-9 建议相同的未命名 lambda 表达式应被替换为命名函数或命名 lambda 表达式。自动化1041
后缀表达式A5-2-1 建议不应使用 dynamic_cast。自动化1177
A5-2-2 必要不应使用传统 C 样式转换。自动化704
A5-2-3 必要指针或引用类型的转换将不应移除任何常量或易失性属性。自动化704
A5-2-4 必要不应使用 reinterpret_cast。自动化1177
A5-2-5 必要不应超过数组或容器的范围访问它们。自动化118
A5-2-6 必要如果操作数包含二进制运算符,逻辑 && 或 || 的操作数应加上圆括号。自动化783
一元表达式A5-3-1 必要typeid 运算符的操作数的求值不应包含其他作用。非自动化758
A5-3-2 文档不应解引用 null 指针。Partially 476
A5-3-3 必要不应删除指向不完整类类型的指针。自动化758
指针成员A5-5-1 必要指向成员的指针不应访问不存在的类成员。自动化758
多元操作符A5-6-1 必要整数除法或余数运算符的右操作数不应等于零。自动化369
equality操作符A5-10-1必要指向成员虚函数的指针应被测试是否等于 null 指针常量。自动化758
条件操作符A5-16-1必要三元条件运算符不应被用作子表达式。自动化1076
语句表达式语句A6-2-1 必要移动和拷贝赋值运算符应移动或分别拷贝类的基类和数据成员,而不产生任何其他作用。自动化710
A6-2-2 必要表达式语句不应仅是对临时对象的构造函数的显式调用。自动化710
选择语句A6-4-1 必要Switch 语句应至少具有两个 case 子句,与默认标签不同。自动化1076
循环表达式A6-5-1 必要不应使用依次通过容器的所有元素而不使用其循环计数器的 for 循环。自动化1076
A6-5-2 必要For 循环应包含一个不应具有浮点类型的循环计数器。自动化691
A6-5-3 建议不应使用 do 语句。自动化1076
A6-5-4 建议For-init 语句和表达式不应执行除循环计数器初始化和修改之外的其他操作。自动化1076
跳转语句A6-6-1 必要不应使用 goto 语句。自动化1177
声明说明符A7-1-1 必要Constexpr 或 const 说明符应用于不可变的数据声明。自动化710
A7-1-2 必要对于在编译时可以确定的值,应使用 constexpr 说明符。自动化710
A7-1-3 必要CV 限定符应放在是 typedef 或 using 名称的类型的右侧。自动化710
A7-1-4 必要不应使用 register 关键字。自动化710
A7-1-5 必要Auto 说明符不应用于除以下情况以外的情况:(1) 声明变量的类型与函数调用的返回类型相同,(2) 声明变量的类型与非基础类型的初始化器相同,(3) 声明通用 lambda 表达式的参数,(4) 使用尾部返回类型语法声明函数模板。自动化710
A7-1-6 必要不应使用 typedef 说明符。自动化710
A7-1-7 必要每个表达式语句和标识符声明都应放置在单独的行中。自动化1078
A7-1-8 必要在声明中,非类型说明符应放置在类型说明符之前。自动化710
A7-1-9 必要类、结构或枚举不应在其类型定义中声明。自动化710
枚举声明A7-2-1 必要具有 enum 基础类型的表达式只应具有与枚举的枚举器对应的值。自动化758
A7-2-2 必要应显式定义枚举基础基类型。自动化758
A7-2-3 必要枚举应声明为限定范围的 enum 类。自动化710
A7-2-4 必要在枚举中,(1) 无,(2) 第一个或 (3) 所有枚举器都应初始化。自动化665
A7-2-5 建议函数的所有重载都应从调用它的位置可见。非自动化710
命名空间A7-3-1 建议不应使用 asm 声明。自动化710
汇编声明A7-4-1 必要函数不应返回通过引用常量传递的参数的引用或指针。自动化710
链接说明A7-5-1 必要函数不应返回指向通过引用传递给常量的参数。自动化691
A7-5-2 必要函数不能直接或间接调用自己。自动化710
属性A7-6-1 必要不应返回使用 [[noreturn]] 属性声明的函数。自动化1076
声明者模糊方案A8-2-1 必要在声明函数模板时,如果返回类型取决于参数的类型,则应使用尾部返回类型语法。自动化710
函数定义A8-4-1 必要不应使用 ellipsis 注解定义函数。自动化710
A8-4-2 必要返回非 void 类型的函数的所有退出路径都应具有包含表达式的显式返回语句。自动化393
A8-4-3 建议不得使用输出参数非自动化 
A8-4-4 建议函数的多个输出值应以结构或元组的形式返回。自动化710
A8-4-5 必要应始终移除被声明为 X && 的“consume”参数。自动化710
A8-4-6 必要应始终转发被声明为 T && 的“forward”参数。自动化710
A8-4-7 必要应通过值传递“cheap to copy”类型的“in”参数。自动化710
A8-4-8 必要不应使用输出参数。自动化710
A8-4-9 必要应修改被声明为 T & 的“in-out”参数。自动化710
A8-4-10必要如果参数不能为 NULL,则它应该通过引用传递。自动化476
A8-4-11必要只有当智能指针表示生命周期语义时,它才能用作参数类型。自动化664
A8-4-12必要std::unique_ptr 应在以下情况下传递给函数:(1) 副本表示该函数拥有所有权 (2) 左值引用表示该函数替换托管的对象。自动化664
A8-4-13必要std::shared_ptr 应在以下情况下传递给函数:(1) 副本表示该函数共享所有权 (2) 左值引用表示该函数替换托管的对象 (3) 常量左值引用表示该函数保留引用计数。自动化664
A8-4-14必要接口应精确且牢固非自动化 
初始化A8-5-0 必要所有内存在被读取之前都应初始化。自动化908
A8-5-1 必要在初始化列表中,初始化的顺序应如下:(1) 继承图的深度和从左向右顺序的虚基类,(2) 继承列表从左向右顺序的直接基类,(3) 按类定义中声明的顺序排列的非静态数据成员。自动化665
A8-5-2 必要没有等号符号的带大括号的初始化 {} 应被用于变量初始化。自动化665
A8-5-3 必要类型 auto 的变量不应使用 {} 或 ={} 带大括号的初始化进行初始化。自动化665
A8-5-4 建议如果类具有获取类型为 std::initializer_list 的参数的用户声明的构造函数,则它应是除特殊成员函数构造函数之外的唯一构造函数。自动化665
成员函数A9-3-1 必要成员函数不应返回非常量“raw”指针或对该类拥有的私有或受保护数据的引用。Partially-自动化393
联合A9-5-1 必要不应使用联合。自动化1177
位域A9-6-1 必要用于与硬件接口或符合通信协议的数据类型应该是不重要的标准布局,并且只包含具有定义大小的类型的成员。Partially-自动化710
A9-6-2 必要位字段仅在与硬件接口或符合通信协议时使用非自动化 
子类通用A10-0-1必要类不能派生自多个不是接口类的基类非自动化 
A10-0-2必要不得在派生类中重新定义非虚拟公共或受保护的成员函数非自动化 
多基类A10-1-1必要类不应派生自多个不是接口类的多个基类。自动化1055
成员名字查找A10-2-1必要非虚公共或受保护的成员函数不应在派生类中重新定义。自动化710
虚拟函数A10-3-1必要虚函数声明应仅包含以下三个说明符之一:(1) virtual,(2) override,(3) final。自动化710
A10-3-2必要每个覆盖虚函数都应使用 override 或 final 说明符声明。自动化710
A10-3-3必要不应在 final 类中引入虚函数。自动化710
A10-3-5必要用户定义的赋值运算符不应为虚运算符。自动化710
抽象类A10-4-1建议层次结构应基于接口类非自动化 
成员访问控制通用A11-0-1建议非 POD 类型应被定义为类。自动化1061
A11-0-2必要定义为结构的类型应:(1) 只提供公共数据成员,(2) 不提供任何特殊的成员函数或方法,(3) 不是另一个结构或类的基类,(4) 不从另一个结构或类继承。自动化710
FriendsA11-3-1必要不应使用 friend 声明。自动化1061
特定成员功能通用A12-0-1必要如果类声明拷贝或移动运算或析构函数,无论是通过“=default”、“=delete”,还是通过用户提供的声明,则也应声明所有其他这五个特殊成员函数。自动化710
A12-0-2必要不应针对对象执行假定内存中的数据表示的位运算和运算。Partially-自动化682
构造函数A12-1-1必要构造函数应显式初始化所有虚基类、所有直接非虚基类和所有非静态数据成员。自动化665
A12-1-2必要构造函数中的 NSDMI 和非静态成员初始化器都不应在同一类型中使用。自动化665
A12-1-3必要如果类的所有用户定义的构造函数都使用所有构造函数之间相同的常量值初始化数据成员,则数据成员应该改为使用 NSDMI 进行初始化。自动化665
A12-1-4必要所有可通过单个基本类型的参数调用的构造函数都应显式声明。自动化710
A12-1-5必要非常量成员的公共类初始化应由委托构造函数完成。Partially-自动化665
A12-1-6必要不需要进一步显式初始化并需要基类中的所有构造函数的派生类将使用继承构造函数。自动化665
析构函数A12-4-1必要基类的析构函数应该是公共虚函数、公共覆盖函数或受保护的非虚函数。自动化401
A12-4-2建议如果类的公共析构函数是非虚函数,则该类应被声明为 final。自动化1076
初始化A12-6-1必要构造函数初始化的所有类数据成员都应使用成员初始化器进行初始化。自动化665
构造和析构A12-7-1必要如果用户定义的特殊成员函数的行为与隐式定义的特殊成员函数相同,则它应被定义为“=default”或保留未定义。自动化1076
拷贝和移动类对象A12-8-1必要移动和拷贝构造函数应移动并分别拷贝类的基类和数据成员,不会产生任何其他作用。自动化710
A12-8-2建议用户定义的拷贝和移动赋值运算符应使用用户定义的无抛出交换函数。自动化703
A12-8-3必要不应读取访问移出对象。Partially-自动化758
A12-8-4必要移动构造函数不应使用拷贝语义初始化其类成员和基类。自动化665
A12-8-5必要拷贝赋值和移动赋值运算符应处理自赋值。自动化758
A12-8-6必要在基类中,拷贝和移动构造函数以及拷贝赋值和移动赋值运算符应声明为 protected 或定义为“=delete”。自动化1076
A12-8-7建议赋值运算符应使用 ref 限定符 & 声明。自动化1076
重载重载声明A13-1-2必要用户定义的常量运算符的用户定义后缀应以下划线开头,并后跟一个或多个字母。自动化1076
A13-1-3必要用户定义的常量运算符应仅执行传递参数的转换。自动化710
声明匹配A13-2-1必要赋值运算符应返回对“this”的引用。自动化710
A13-2-2必要二进制算术运算符和位运算符应返回“prvalue”。自动化682
A13-2-3必要关系运算符应返回布尔值。自动化682
重载方案A13-3-1必要如果函数包含“转发引用”作为其参数,则不应重载。自动化710
重载操作符A13-5-1必要如果要使用非常量版本重载“operator[]”,则还应实现常量版本。自动化710
A13-5-2必要所有用户定义的转换运算符都应显式定义。自动化710
A13-5-3建议不应使用用户定义的转换运算符。自动化704
A13-5-4必要如果定义了两个相反的运算符,一个应根据另一个进行定义。自动化710
A13-5-5必要比较运算符应为参数类型相同且 noexcept 的非成员函数。自动化697
内建操作符A13-6-1必要数字序列分隔符仅应按如下方式使用:(1) 对于十进制数字,每隔 3 位,(2) 对于十六进制数字,每隔 2 位,(3) 对于二进制数字,每隔 4 位。自动化1076
模板模板参数A14-1-1建议模板应该检查是否有适合该模板的特定模板参数。非自动化703
模板声明A14-5-1必要模板构造函数不应参与封装类类型的单个参数的重载解析。自动化710
A14-5-2建议不依赖于模板类参数的类成员应在单独的基类中定义。Partially-自动化1076
A14-5-3建议非成员通用运算符仅应在不包含类(构造)类型、枚举类型或联合类型声明的命名空间中声明。自动化710
模板安装和说明A14-7-1必要用作模板参数的类型应提供该模板使用的所有成员。自动化710
A14-7-2必要模板具体化应在以下相同文件中声明:(1) 与声明具体化的主模板相同的文件 (2) 与声明具体化的用户定义的类型相同的文件。自动化758
功能模板说明A14-8-2必要不应使用函数模板的显式具体化。自动化710
异常处理通用A15-0-1必要如果函数能够完成其任务,则不得异常退出非自动化 
A15-0-2必要对于所有运算,针对异常安全应至少提供基本保证。另外,每个函数都可以提供强有力的保证或不抛出的保证。Partially-自动化755
A15-0-3必要应考虑被调用函数的异常安全保证。非自动化755
A15-0-4必要未选中的异常应用于表示调用方无法合理恢复的错误非自动化 
A15-0-5必要选中的异常应用于表示调用方可以合理地从中恢复的错误非自动化 
A15-0-6必要应进行分析,以分析异常处理的故障模式非自动化 
A15-0-7文档异常处理机制应保证确定的最坏情况下的执行时间。Partially 755
A15-0-8必要应进行最坏情况执行时间(WCET)分析,以确定软件的最大执行时间限制非自动化 
抛出一个异常A15-1-1建议仅应抛出派生自 std::exception 的类型的实例。自动化755
A15-1-2必要异常对象不应是指针。自动化755
A15-1-3建议所有抛出的异常都应唯一。自动化755
A15-1-4必要如果函数异常退出,则在抛出之前,该函数应安置其在有效状态下构造的所有对象/资源,或将它们删除。Partially-自动化401
A15-1-5必要不应跨执行边界抛出异常。非自动化755
构造函数和析构函数A15-2-1必要在程序启动之前,不应调用非 noexcept 的构造函数。自动化755
A15-2-2必要如果构造函数不是 noexcept 且构造函数不能完成对象初始化,则它应释放对象的资源并抛出异常。Partially-自动化404
捕获一个异常A15-3-2必要如果函数抛出异常,则应在可以采取有意义的行动,否则传播。非自动化 
A15-3-3必要主函数和任务主函数应至少捕获:使用的所有第三方库中的基类异常、std::exception 和所有其他未处理的异常。Partially-自动化755
A15-3-4必要Catch-all(ellipsis 和 std::exception)处理程序仅应用于以下情况 (a) 主函数,(b) 任务主函数,(c) 在应该隔离独立组件的函数中,以及 (d) 在调用不按照  准则使用异常的第三方代码时。非自动化755
A15-3-5必要类类型异常应由引用或 const 引用捕获。自动化755
异常说明符A15-4-1必要不应使用动态异常规范。自动化755
A15-4-2必要如果函数被声明为 noexcept、noexcept(true) 或 noexcept(<true condition>),则它不应异常退出。自动化703
A15-4-3必要函数的 noexcept 规范在所有编译单元之间都应相同,或者在虚成员函数和覆盖器之间相同或有更严格的限制。自动化703
A15-4-4必要非抛出函数声明应包含 noexcept 规范。自动化1076
A15-4-5必要可能从函数中抛出的已检查异常应与函数声明一起指定,它们在所有函数声明中以及对其所有覆盖者都应是相同的。自动化703
特殊功能A15-5-1必要所有用户提供的类析构函数、释放函数、移动构造函数、移动赋值运算符和交换函数均不应异常退出。应酌情将 noexcept 异常规范添加到这些函数中。自动化755
A15-5-2必要程序不应突然终止。特别是,不应该隐式或显式地调用 std::abort()、std::quick_exit()、std::_Exit()、std::terminate()。Partially-自动化404
A15-5-3必要不应隐式调用 std::terminate() 函数。自动化758
预处理通用A16-0-1必要预处理器仅应用于无条件和有条件的文件包含及 include 保护,并使用以下指令:(1) #ifndef、(2) #ifdef、(3) #if、(4) #if defined、(5) #elif、(6) #else、(7) #define、(8) #endif、(9) #include。自动化710
源文件包含A16-2-1必要头文件名称或 #include 指令中不应出现 '、"、/*、//、\ 字符。自动化710
A16-2-2必要不应有未使用的包含指令。自动化
A16-2-3必要对于文件中使用的每个符号,都应显式地添加包含指令。非自动化
error指令A16-6-1必要不应使用 #error 指令。自动化1177
Pragma指令A16-7-1必要不应使用 #pragma 指令。自动化1177
库介绍通用A17-0-1必要不应定义、重新定义或取消定义 C++ 标准库中的保留标识符、宏和函数。自动化1076
A17-0-2必要所有项目代码,包括使用的库(包括标准库和用户定义库)和任何第三方用户代码,应符合AUTOSAR C++14编码指南非自动化 
C语言标准库A17-1-1必要C 标准库的使用应被封装和隔离。非自动化1061
库扩展需求A17-6-1必要不应将非标准实体添加到标准命名空间中。自动化758
语言支持库通用A18-0-1必要C 库工具应只能通过 C++ 库头文件访问。自动化1076
A18-0-2必要应检查从字符串到数值的转换的错误状态。自动化703
A18-0-3必要不应使用库 <clocale> (locale.h) 和 setlocale 函数。自动化1177
类型A18-1-1必要不应使用 C 样式数组。自动化710
A18-1-2必要不应使用 std::vector<bool> 具体化。自动化1177
A18-1-3必要不应使用 std::auto_ptr 类型。自动化1177
A18-1-4必要指向对象数组的元素的指针不应被传递给单个对象类型的智能指针。自动化758
A18-1-6必要用户定义的类型的所有 std::hash 具体化都应该具有 noexcept 函数调用运算符。自动化703
动态内存管理A18-5-1必要不应使用函数 malloc、calloc、realloc 和 free。自动化1177
A18-5-2文档不应使用非 placement new 或 delete 表达式。Partially 664
A18-5-3必要Delete 表达式的形式应与用于分配内存的 new 表达式的形式匹配。自动化762
A18-5-4必要如果项目全局定义了运算符“delete”的分大小或不分大小的版本,则应同时定义分大小和不分大小的版本。自动化710
A18-5-5文档内存管理函数应确保以下各项:(a) 由于存在最坏情况的执行时间而导致的确定性行为,(b) 避免内存碎片,(c) 避免内存耗尽,(d) 避免不匹配的分配或释放,(e) 不依赖对内核的非确定性调用。Partially 664
A18-5-6必要应进行分析以分析故障模式动态内存管理。特别是应分析失效模式:(a)非确定性行为
导致不存在最坏情况的执行时间,(b) 内存碎片,(c)内存不足,(d)不匹配的分配和解除分配,(e)依赖于对内核的非确定性调用
非自动化 
A18-5-7必要动态存储器的非实时实现项目中使用了管理功能,则存储器应仅在非实时程序期间分配和解除分配相位非自动化 
A18-5-8必要时效短于函数的对象应具有自动存储持续时间。Partially-自动化664
A18-5-9必要动态内存分配和释放函数的自定义实现应该满足 C++ 标准中相应的“必要行为”子句中指定的语义要求。自动化664
A18-5-10必要Placement new 仅应与适当对齐的指针一起使用,以达到足够的存储容量。自动化664
A18-5-11必要应一起定义“operator new”和“operator delete”。自动化762
其它运行时支持A18-9-1必要不应使用 std::bind。自动化1177
A18-9-2必要将值转发到其他函数应通过以下方式执行:(1) std::move,如果值为右值引用,(2) std::forward,如果值为转发引用。自动化691
A18-9-3必要不应在声明了 const 或 const& 的对象上使用 std::move。自动化710
A18-9-4必要不应随后使用 std::forward 的参数。自动化710
通用应用库smart指针A20-8-1必要已拥有的指针值不应存储在无关的智能指针中。自动化675
A20-8-2必要不应使用 std::unique_ptr 来表示独占所有权。自动化282
A20-8-3必要std::shared_ptr 应用于表示共享所有权。自动化282
A20-8-4必要如果不需要所有权共享,应该使用 std::unique_ptr 来代替 std::shared_ptr。自动化282
A20-8-5必要std::make_unique 应用于构造 std::unique_ptr 拥有的对象。自动化665
A20-8-6必要std::make_shared 应用于构造 std::shared_ptr 拥有的对象。自动化665
A20-8-7必要std::weak_ptr 应用于表示临时共享所有权。非自动化282
字符串库NULL字符结束的序列应用A21-8-1必要字符处理函数的参数应可表示为无符号字符。自动化20
容器库通用A23-0-1必要Iterator 不应隐式转换为 const_iterator。自动化704
A23-0-2必要容器的元素只应通过有效的引用、iterator 和指针访问。自动化664
算法库通用A25-1-1必要不应拷贝与此对象的标识相关的状态的非静态数据成员或谓词函数对象的捕获值。自动化758
排序和相关的操作A25-4-1必要与关联容器和 STL 排序及相关算法一起使用的排序谓词应遵循严格的弱排序关系。非自动化710
 随机数产生器 A26-5-1必要不应使用 std::rand() 生成伪随机数。自动化1241
A26-5-2必要不应默认初始化随机数引擎。自动化330
输入/输出库通用A27-0-1必要应验证独立组件的输入.非自动化 
A27-0-2必要容器的元素只应通过有效的引用、iterator 和指针访问。自动化170
A27-0-3必要在未插入中间 flush 或定位调用的情况下,不应使用对文件流的交替输入和输出操作。自动化664
A27-0-4必要不应使用 C 样式字符串。自动化1076
语言独立性问题不必要的结构M0-1-1 必要项目不应包含无法到达的代码。自动化561
M0-1-2 必要项目不应包含不可达的路径。自动化561
M0-1-3 必要项目不应包含未使用的变量。自动化1164
M0-1-4 必要项目不应包含只使用一次的非易失性 POD 变量。自动化710
M0-1-8 必要返回 void 类型的所有函数都有外部其他作用。自动化1164
M0-1-9 必要不应存在无用代码。自动化1164
M0-1-10建议每个定义的函数至少应调用一次。自动化561
存储M0-2-1 必要不应将对象分配给重叠的对象。自动化416
运行时错误M0-3-1 必要应通过使用以下至少一种方法确保运行时故障最小化:(a)静态分析工具/技术;(b) 动态分析工具/技术;(c) 显式编码检查以处理运行时错误非自动化 
M0-3-2 必要如果函数生成了错误信息,则应该测试该错误信息。非自动化754
算法M0-4-1 必要应记录缩放整数或定点算法的使用非自动化 
M0-4-2 必要应记录浮点运算的使用非自动化 
通常语言M1-0-2 必要只有当多个编译器具有公共非自动化 
固定词语注释M2-7-1 必要不应在 C 风格注释中使用字符序列 /*。自动化1113
标识符M2-10-1必要不同的标识符在排字上应该清楚明确。自动化1076
进制M2-13-2必要不应使用八进制常量(零除外)和八进制转义序列(“0”除外)。自动化1076
M2-13-3必要应对所有无符号类型的八进制或十六进制整数常量应用“U”后缀。自动化1076
M2-13-4必要常数值后缀应该采用大写。自动化1076
基本概念声明和定义M3-1-2 必要函数不应在块范围内声明。自动化710
一个定义规则M3-2-1 必要对象或函数的所有声明都应具有兼容类型。自动化758
M3-2-2 必要不应违反“一个定义规则”。自动化758
M3-2-3 必要在多个编译单元中使用的类型、对象或函数应在一个且仅在一个文件中声明。自动化710
M3-2-4 必要包含外部链接的标识符应只具有一个定义。自动化694
陈述区域和范围M3-3-2 必要如果函数包含内部链接,则所有重新声明应包括静态存储类说明符。自动化710
名字查询M3-4-1 必要声明为对象或类型的标识符应在最小化其可见性的块中定义。自动化1126
类型M3-9-1 必要用于对象、函数返回类型或函数参数的类型在所有声明和重新声明中均应为标识符相同。自动化710
M3-9-3 必要不应使用浮点值的基础位表示法。自动化682
标准类型完整提升M4-5-1 必要不应将具有 bool 类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符 =、逻辑运算符 &&、||、!、等号运算符 == 和 !=、一元 & 运算符以及条件运算符。自动化480
M4-5-3 必要不应将具有(普通)char 和 wchar_t 类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符 =、等号运算符 == 和 != 以及一元 & 运算符。自动化710
指针原型M4-10-1必要不应将 NULL 用作整数值。自动化843
M4-10-2必要不应将常数值零 (0) 用作非指针常量。自动化547
表达式通用M5-0-2 建议在表达式中,应有限地依赖 C++ 运算符优先规则。Partially-自动化783
M5-0-3 必要不应将 cvalue 表达式隐式转换为其他基础类型。自动化704
M5-0-4 必要隐式整数转换不应改变基础类型的符号。自动化681
M5-0-5 必要不应存在隐式浮点-整数转换。自动化681
M5-0-6 必要隐式整数或浮点转换不应减小基础类型的大小。自动化681
M5-0-7 必要cvalue 表达式不应存在显式浮点-整数转换。自动化681
M5-0-8 必要显式整数或浮点转换不应增加 cvalue 表达式基础类型的大小。自动化704
M5-0-9 必要显式整数转换不应改变 cvalue 表达式基础类型的符号。自动化681
M5-0-10必要如果对基础类型为无符号 char 或无符号 short 的操作数应用了位运算符 ~ 和 <<,结果应立即转换为操作数的基础类型。自动化682
M5-0-11必要普通 char 类型只应该用于存储,并使用字符值。自动化710
M5-0-12必要带符号的和无符号的 char 类型只应该用于存储,并使用数字值。自动化710
M5-0-14必要条件运算符的第一个操作数应具有 bool 类型。自动化710
M5-0-15必要数组索引应该是指针算术运算唯一的形式。自动化682
M5-0-16必要指针操作数以及通过针对该操作数的指针算术运算获得的指针应访问相同数组的元素。自动化823
M5-0-17必要指针之间的减法运算只应该应用到访问同一数组的元素的指针。自动化823
M5-0-18必要不应对类型为指针的对象应用 >、>=、< 和 <=,除非它们指向同一数组。自动化682
M5-0-20必要二进制位运算符的非常量操作数应具有相同的基础类型。自动化682
M5-0-21必要位运算符只应该应用于无符号基础类型的操作数。自动化682
表达式后置表达式M5-2-2 必要只应通过 dynamic_cast 将虚基类的指针转换为继承类的指针。自动化704
M5-2-3 建议不应对多态类型执行基类到继承类的转换。自动化704
M5-2-6 必要转换不应将函数指针转换为任何其他指针类型,包括函数类型指针。自动化704
M5-2-8 必要不应将具有整数类型或 void 类型指针的对象转换为具有指针类型的对象。自动化704
M5-2-9 必要转换不应将指针类型转换为整数类型。自动化704
M5-2-10必要在表达式中,递增 (++) 和递减 (--) 运算符不应与其他运算符混合使用。自动化682
M5-2-11必要逗号运算符、&& 运算符和 || 运算符不应重载。自动化710
M5-2-12必要作为函数参数传递的类型为数组的标识符不应退化为指针。自动化710
一元表达式M5-3-1 必要! 运算符、逻辑运算符 && 或 || 的每个操作数的类型都应为 bool。自动化1076
M5-3-2 必要不应对基础类型为无符号类型的表达式应用一元减运算符。自动化682
M5-3-3 必要一元 & 运算符不应重载。自动化710
M5-3-4 必要sizeof 运算符的操作数的求值不应包含其他作用。自动化758
左移表达式M5-8-1 必要移位运算符的右操作数应介于 0 和左操作数基础类型的位宽度减 1 之间。Partially-自动化682
逻辑与操作符M5-14-1必要逻辑运算符 &&、|| 的右操作数不应包含其他作用。自动化758
指定操作符M5-17-1必要二元运算符与其赋值运算符形式之间的语义等价性应保持不变非自动化 
逗号操作符M5-18-1必要不应使用逗号运算符。自动化1076
常量操作符M5-19-1必要无符号的整数常量表达式的求值不应导致溢出。自动化190
语句表达式语句M6-2-1 必要不应在子表达式中使用赋值运算符。自动化481
M6-2-2 必要不应直接或间接对浮点表达式执行相等或不等测试。Partially-自动化1077
M6-2-3 必要在预处理之前,null 语句只能单独一行出现;该 null 语句可后接注释,前提是该语句后接的第一个字符是空格。自动化710
复合表达式M6-3-1 必要构成 switch、while、do ... while 或 for 语句主体的语句应该是复合语句。自动化710
选择表达式M6-4-1 必要if(条件)结构应该后接复合语句。else 关键字应该后接复合语句或另一个 if 语句。自动化710
M6-4-2 必要所有 if ... else if 结构应以 else 子句结束。自动化691
M6-4-3 必要switch 语句应是符合语法的 switch 语句。自动化710
M6-4-4 必要switch 标签只应在最里层的复合语句是 switch 语句的主体时使用。自动化710
M6-4-5 必要无条件的 throw 或 break 语句应该终止每一个非空 switch 子句。自动化691
M6-4-6 必要switch 语句的最终子句应该是 default 子句。自动化484
M6-4-7 必要switch 语句的条件不应包含 bool 类型。自动化710
迭代表达式M6-5-2 必要如果循环计数器未通过 -- 或 ++ 修改,则在条件中,只应将循环计数器用作 <=、<、> 或 >= 的操作数。自动化691
M6-5-3 必要不应在条件或语句中修改循环计数器。自动化1095
M6-5-4 必要循环计数器应通过以下其中一项修改:--、++、-=n 和 +=n;,其中 n 在循环持续时间内保持为常量。自动化691
M6-5-5 必要除循环计数器以外的循环控制变量不应在条件或表达式内进行修改。自动化1095
M6-5-6 必要在语句中修改的除循环计数器之外的循环控制变量应具有 bool 类型。自动化691
跳转表达式M6-6-1 必要goto 语句引用的任何标签都应在同一代码块或包括该 goto 语句的代码块中声明。自动化691
M6-6-2 必要goto 语句应跳转到在同一函数主体后半部分中声明的标签。自动化691
M6-6-3 必要不应在循环语法中使用 continue 语句。自动化691
声明说明符M7-1-2 必要如果函数参数是不能修改的对象,应该在函数中将相对应的参数的指针或引用声明为 const 指针或 const 引用。自动化710
命名空间M7-3-1 必要全局命名空间只应包含 main、命名空间声明和 extern“C”声明。自动化1108
M7-3-2 必要标识符 main 不应用于除全局函数 main 之外的函数。自动化1076
M7-3-3 必要头文件中不应存在未命名的命名空间。自动化710
M7-3-4 必要不应使用 using 指令。自动化710
M7-3-6 必要不应在头文件中使用 using 指令或 using 声明(不包括 using 声明中的类范围或函数范围)。自动化710
asm声明M7-4-1 必要汇编程序的所有使用都应记录在案非自动化 
M7-4-2 必要汇编程序说明只应使用 asm 声明引入。自动化710
M7-4-3 必要应该独立封装汇编语言。自动化1061
链接规范M7-5-1 必要函数不应返回在函数内定义的自动变量(包括参数)的引用或指针。非自动化758
M7-5-2 必要在第一个对象消失后不应将自动存储对象的地址赋值给另一个可能仍然存在的对象。非自动化416
声明者通用M8-0-1 必要init-declarator-list 或 member-declarator-list 应该分别包括一个 init-declarator 或 member-declarator。自动化710
声明含义M8-3-1 必要覆盖虚函数中的参数应使用与其覆盖的函数相同的默认参数,否则不应指定任何默认参数。自动化710
功能定义M8-4-2 必要用于函数的重新声明中的参数的标识符应与声明中的标识符相同。自动化710
M8-4-4 必要函数标识符应该只用于函数调用,或者在其前使用 & 前缀。自动化710
初始化M8-5-2 必要在数组和结构的非零初始化中,应使用大括号指示和匹配结构。自动化665
成员方法M9-3-1 必要常量成员函数不应返回类数据的非常量指针或引用。自动化710
M9-3-3 必要如果成员函数可以是静态,则它应该是静态,另外如果它可以是 const,则它应该是 const。自动化710
位域M9-6-1 必要当表示位字段的位的绝对位置则应记录位字段的行为和包装。非自动化 
M9-6-4 必要已命名带符号整数类型的位域的长度应超过一位。自动化710
子类多个基类M10-1-1建议不应该通过虚基类来继承类。自动化1076
M10-1-2必要如果将基类用于菱形层次架构中,则只应将其声明为虚基类。自动化710
M10-1-3必要可访问基类在同一层次架构中不能同时为虚基类和非虚基类。自动化710
成员方法查找M10-2-1建议多继承层次架构中的所有可访问实体名称都应该唯一。自动化694
虚方法M10-3-3必要如果虚函数被声明为纯虚函数,则该虚函数只应被纯虚函数覆盖。自动化710
成员访问控制通用M11-0-1必要非 POD 类类型中的成员数据应该是私有的。自动化1061
特殊成员方法构造器M12-1-1必要对象的动态类型不应在其构造函数或析构函数的主体中使用。自动化758
模板模板声明M14-5-3必要当存在具有类属参数的模板赋值运算符时,应声明复制赋值运算符。自动化710
名字解析M14-6-1必要在具有从属基类的类模板中,在该从属基类中可能找到的任何名称应使用 qualified-id 或 this-> 引用。自动化710
异常处理通用M15-0-3必要不应使用 goto 或 switch 语句将控制转化为 try 或 catch 块。自动化691
抛出异常M15-1-1必要throw 语句的赋值表达式本身不应导致抛出异常。自动化755
M15-1-2必要不应显式抛出 NULL。自动化755
M15-1-3必要空 throw (throw;) 只应用于 catch 处理程序的复合语句。自动化755
处理异常M15-3-1必要只应在启动之后并且在终止之前报告异常。自动化755
M15-3-3必要类构造函数或析构函数的 function-try-block 实现的处理程序不应引用此类或其基类的非静态成员。自动化755
M15-3-4必要代码中显式抛出的每个异常在所有可能导致该异常的调用路径中都应具有兼容类型的处理程序。自动化755
M15-3-6必要当在针对继承类及其部分或全部基类的单个 try-catch 语句或 function-try-block 中提供多个处理程序时,应按从最上层继承类到基类的顺序排列这些处理程序。自动化755
M15-3-7必要当在单个 try-catch 语句或 function-try-block 中提供多个处理程序时,所有 ellipsis (catch-all) 处理程序都应最后发生。自动化755
预处理指令通用M16-0-1必要文件中的 #include 指令之前只能包含其他预处理器指令或注释。自动化710
M16-0-2必要在全局命名空间中,只应使用 #define 或 #undef 定义或取消定义宏。自动化710
M16-0-5必要类似于函数的宏的参数不应包含看起来像是预处理指令的标识符。自动化628
M16-0-6必要在类似于函数的宏的定义中,参数的每个实例都应使用圆括号括起,除非它被用作 # 或 ## 的操作数。自动化710
M16-0-7必要不应将未定义的宏标识符用于 #if 或 #elif 预处理器指令,除非作为定义的运算符的操作数。自动化710
M16-0-8必要如果 # 标识符在行中显示为第一个标识符,则其后应紧接预处理标识符。自动化710
条件包含M16-1-1必要定义的预处理器运算符只能采用两种标准形式中的一种。自动化710
M16-1-2必要所有 #else、#elif 和 #endif 预处理器指令都应和相关的 #if 或 #ifdef 指令处在同一文件中。自动化710
源文件包含M16-2-3必要应提供包含保护。自动化710
宏取代M16-3-1必要在单个宏定义中,# 或 ## 运算符最多只应出现一次。自动化710
M16-3-2建议不应使用 # 和 ## 运算符。自动化710
库接口通用M17-0-2必要标准库宏和对象的名称不应再次使用。自动化710
M17-0-3必要不应覆盖标准库函数的名称。自动化710
M17-0-5必要不应使用 setjmp 宏和 longjmp 函数。自动化364
语言支持库通用M18-0-3必要不应使用来自库 <cstdlib> 中的库函数 abort、exit、getenv 和 system。自动化1177
M18-0-4必要不应使用库 <ctime> 的时间处理函数。自动化1177
M18-0-5必要不应使用库 <cstring> 的无边界函数。自动化1177
实现属性M18-2-1必要不应使用宏 offsetof。自动化1177
其它运行时支持M18-7-1必要不应使用 <csignal> 的信号处理设施。自动化1177
诊断库错误数M19-3-1必要不应使用错误指示器 errno。自动化1177
输入/输出库通用M27-0-1必要不应使用数据流输入/输出库 <cstdio>。自动化1177

(结束)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

manok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值