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

Autosar标准解析_第1张图片

         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  必要 应该使用来自指示大小和符号的 的固定宽度整数类型代替基本数值类型。 自动化 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(),则它不应异常退出。 自动化 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 必要 不应使用库 (locale.h) 和 setlocale 函数。 自动化 1177
类型 A18-1-1 必要 不应使用 C 样式数组。 自动化 710
A18-1-2 必要 不应使用 std::vector 具体化。 自动化 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 必要 不应使用来自库 中的库函数 abort、exit、getenv 和 system。 自动化 1177
M18-0-4 必要 不应使用库 的时间处理函数。 自动化 1177
M18-0-5 必要 不应使用库 的无边界函数。 自动化 1177
实现属性 M18-2-1 必要 不应使用宏 offsetof。 自动化 1177
其它运行时支持 M18-7-1 必要 不应使用 的信号处理设施。 自动化 1177
诊断库 错误数 M19-3-1 必要 不应使用错误指示器 errno。 自动化 1177
输入/输出库 通用 M27-0-1 必要 不应使用数据流输入/输出库 自动化 1177

(结束)

你可能感兴趣的:(代码安全,软件安全,市场浅析,java,开发语言)