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 | ||
Friends | A11-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 |
(结束)