Skip to main content

MISRA C++:2008

MISRA C++:2008 规则覆盖情况

NaiveSystems Analyze 支持所有 MISRA C++:2008 要求规则的静态检查.

支持总计
强制(Document)0120%
要求(Required)19319897%
建议(Advisory)1186%
所有类别19422885%

MISRA C++:2008 规则支持情况

规则编码规则名称类别是否支持

语言独立问题

非必要结构
Rule 0-1-1项目不得包含不可达代码要求
Rule 0-1-2项目不得包含不可行路径要求
Rule 0-1-3项目不得包含未使用的变量要求
Rule 0-1-4项目不得包含只使用一次的非易失性(non-volatile)POD变量要求
Rule 0-1-5项目不得包含未使用的类型声明要求
Rule 0-1-6项目不得含有“非易失性变量被赋值,随后始终未使用该值”的实例要求
Rule 0-1-7不是重载运算符的函数,若其返回类型为非 void,则必须使用其返回值要求
Rule 0-1-8具有 void 返回类型的函数必须有外部副作用要求
Rule 0-1-9不得存在死代码要求
Rule 0-1-10每个被定义的函数必须至少被调用一次要求
Rule 0-1-11非虚(non-virtual)函数中不得存在未使用的形参(无论命名或未命名)要求
Rule 0-1-12在一个虚拟函数和所有覆盖了它的函数的形参集中,不得有未使用的(命名或未命名)形参要求
存储
Rule 0-2-1不得将对象分配给与其重叠的对象要求
运行时失败
Rule 0-3-1必须通过使用以下至少一种方法来确保尽量减少运行时失败(run-time failure):(a)静态分析工具/技术;(b)动态工具/技术;(c)处理运行时失败的显式代码强制
Rule 0-3-2如果函数返回了错误信息,那么必须测试该错误信息要求
算术
Rule 0-4-1缩放整型(scaled-integer)算术或定点算术的使用必须有文档记录强制
Rule 0-4-2浮点算术的使用必须有文档记录强制
Rule 0-4-3浮点实现必须符合定义的浮点标准强制

一般规则

语言
Rule 1-0-1所有代码必须遵循 ISO/IEC 14882:2003 C++标准(包含技术勘误1)要求
Rule 1-0-2只有在使用同一个已定义的接口时才能使用多个编译器强制
Rule 1-0-3在选定的编译器中进行整型除法时,必须确定并记录它的实现强制

词法约定

字符集
Rule 2-2-1字符集及对应的编码必须有文档记录强制
三字符组
Rule 2-3-1不得使用三字符组要求
替代标记
Rule 2-5-1不应使用双字符组(digraph)建议
注释
Rule 2-7-1不得在C语言风格的注释内部使用字符序列 /*要求
Rule 2-7-2不得使用C语言风格的注释将代码段“注释掉”要求
Rule 2-7-3不应使用C++注释将代码段“注释掉”建议
标识符
Rule 2-10-1必须确保标识符使用不易混淆的排版要求
Rule 2-10-2在内部作用域中声明的标识符不得隐藏在外部作用域中声明的标识符要求
Rule 2-10-3类型定义(typedef)名称(如有修饰,那么也包括修饰)必须是唯一标识符要求
Rule 2-10-4类、联合体或枚举的名称(如有修饰,那么也包括修饰)必须是唯一标识符要求
Rule 2-10-5具有静态存储周期的非成员对象或函数的标识符名称不应重复使用建议
Rule 2-10-6如果某标识符已经指代了一个类型,那么在同一作用域内,它不得用于指代一个对象或函数要求
字面量
Rule 2-13-1只能使用ISO/IEC 14882:2003中定义的转义序列要求
Rule 2-13-2不得使用八进制常量(零除外)和八进制转义序列(“\0”除外)要求
Rule 2-13-3必须对所有八进制或十六进制的无符号整型字面量使用后缀“U”要求
Rule 2-13-4字面量后缀必须是大写字母要求
Rule 2-13-5不得将宽字符串字面量和窄字符串字面量串接要求

基本概念

声明和定义
Rule 3-1-1在不违反“单一定义规则”的情况下,可以在多个翻译单元中包含任何头文件要求
Rule 3-1-2不得在块作用域内声明函数要求
Rule 3-1-3声明一个数组时,必须显式说明其大小,或通过初始化隐式定义其大小要求
单一定义规则
Rule 3-2-1一个对象或函数的所有声明的类型必须兼容要求
Rule 3-2-2不得违反单一定义规则要求
Rule 3-2-3在多个翻译单元中使用的类型、对象或函数必须在且仅在文件中声明要求
Rule 3-2-4一个具有外部链接的标识符必须有且仅有一个定义要求
声明区域和范围
Rule 3-3-1具有外部链接的对象或函数必须在一个头文件中声明要求
Rule 3-3-2如果一个函数有内部链接,那么所有的重新声明都必须包括静态(static)存储类说明符要求
查找名称
Rule 3-4-1声明为对象或类型的标识符必须在一个使其可见性最低的代码块中定义要求
类型
Rule 3-9-1在所有声明和重新声明中,用于对象、函数返回类型或函数参数的类型的每个词符必须对应相同要求
Rule 3-9-2应使用指示大小和符号性的类型定义(typedef)代替基本数据类型建议
Rule 3-9-3不得使用浮点值的底层位表示(underlying bit representations)要求

标准转换

整型提升
Rule 4-5-1不得将具有bool类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符=、逻辑运算符&&、||和!、相等运算符==和!=、一元运算符&以及条件运算符要求
Rule 4-5-2不得将具有枚举类型的表达式用作内置运算符的操作数,以下运算符除外:下标运算符[ ]、赋值运算符=、相等运算符==和!=、一元运算符&以及关系运算符<、<=、>和>=要求
Rule 4-5-3不得将具有(普通)char和wchar_t类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符=、相等运算符==和!=以及一元运算符&要求
指针转换
Rule 4-10-1NULL不得用作整型值要求
Rule 4-10-2字面量零(0)不得用作空指针常量要求

表达式

一般规则
Rule 5-0-1无论采取何种求值顺序(只要标准允许采用该顺序),表达式的值不得发生改变要求
Rule 5-0-2在表达式中,应有限制地依赖 C++ 运算符优先级规则建议
Rule 5-0-3不得将c值表达式隐式转换为其他底层类型要求
Rule 5-0-4隐式整型转换不得改变底层类型的符号性要求
Rule 5-0-5不得存在隐式的浮点-整型转换要求
Rule 5-0-6隐式的整型或浮点转换不得使底层类型变小要求
Rule 5-0-7c值表达式不得存在显式的浮点-整型转换要求
Rule 5-0-8显式的整型或浮点转换不得使c值表达式的底层类型变大要求
Rule 5-0-9显式的整型转换不得改变c值表达式的底层类型的符号性要求
Rule 5-0-10如果对底层类型为无符号char或无符号short的操作数应用按位操作符~和<<,其结果必须立即转换为该操作数的底层类型要求
Rule 5-0-11普通的char类型只得用于存储和使用字符值要求
Rule 5-0-12有符号char和无符号char类型只得用于存储和使用数字值要求
Rule 5-0-13if语句的条件和迭代语句的条件都必须具有bool类型要求
Rule 5-0-14条件运算符的第一个操作数必须为bool类型要求
Rule 5-0-15指针算术只能以数组索引的形式进行要求
Rule 5-0-16指针操作数,以及任何使用该操作数经过指针算术得到的指针,必须对同一数组的元素寻址要求
Rule 5-0-17指针相减只能用来对同一数组的指针寻址要求
Rule 5-0-18>、>=、<、<=不得应用于类型为指针的对象,除非它们指向同一数组要求
Rule 5-0-19对象的声明不得包含超过两级的指针间接要求
Rule 5-0-20二元按位运算符的非常量操作数必须具有相同的底层类型要求
Rule 5-0-21按位运算符只得用于无符号底层类型的操作数要求
后缀表达式
Rule 5-2-1逻辑运算符&&或||的每个操作数都必须是后缀表达式要求
Rule 5-2-2指向虚基类(virtual base class)的指针只能通过dynamic_cast的方式被转换为指向派生类(derived class)的指针要求
Rule 5-2-3不应对多态类型(polymorphic types)进行从基类到派生类的转换建议
Rule 5-2-4不得使用C风格的cast转换(除了void转换)和函数式记法转换(除了显式构造函数调用)要求
Rule 5-2-5不得使用cast移除指针类型或引用类型的任何const或volatile修饰要求
Rule 5-2-6不得使用cast将一个函数指针转换为任何其他指针类型,包括函数指针类型要求
Rule 5-2-7不得直接或间接将一个具有指针类型的对象转换为不相关的指针类型要求
Rule 5-2-8不得将具有整数类型或void指针类型的对象转换为具有指针类型的对象要求
Rule 5-2-9不应使用cast把指针类型转换为整数类型建议
Rule 5-2-10在表达式中,自增(++)和自减(--)运算符不应与其他运算符混合使用建议
Rule 5-2-11不得重载逗号运算符、&&运算符和||运算符要求
Rule 5-2-12作为函数实参传递的数组类型的标识符不得退化为指针要求
一元表达式
Rule 5-3-1!运算符、逻辑运算符&&或||的每个操作数都必须是bool类型要求
Rule 5-3-2一元减法运算符不得用于底层类型为无符号类型的表达式要求
Rule 5-3-3不得重载一元&操作符要求
Rule 5-3-4sizeof运算符的操作数的求值不得含有副作用要求
移位运算符
Rule 5-8-1移位运算符的右操作数的范围下限为零,上限须比左操作数的底层类型的位宽度小一要求
逻辑与运算符
Rule 5-14-1逻辑与(&&)和逻辑或(||)运算符的右操作数不得含有副作用要求
赋值运算符
Rule 5-17-1必须保留二元运算符及其赋值运算符形式之间的语义等价要求
逗号运算符
Rule 5-18-1不得使用逗号运算符(,)要求
常量表达式
Rule 5-19-1对无符号常量表达式进行求值不应导致回绕建议

语句

表达式语句
Rule 6-2-1不得在子表达式中使用赋值运算符要求
Rule 6-2-2不得直接或间接地对浮点表达式进行相等性或不等性测试要求
Rule 6-2-3在预处理之前,null语句只能单独一行出现;如果null语句后接的第一个字符是空格,那么该语句可后接一条注释要求
复合语句
Rule 6-3-1构成switch、while、do...while或for语句主体的语句必须为复合语句要求
选择语句
Rule 6-4-1一个if(条件)结构必须后接一个复合语句;else关键字必须后接一个复合语句或另一个if语句要求
Rule 6-4-2所有if … else if结构都必须以一个else语句终止要求
Rule 6-4-3switch语句必须为良构(well-formed)要求
Rule 6-4-4switch标号只得出现在构成switch语句主体的复合语句的最外层要求
Rule 6-4-5每个非空的switch子句都必须以一个无条件的throw或break语句终止要求
Rule 6-4-6switch语句的最后一个子句必须是default子句要求
Rule 6-4-7switch语句的条件不得是bool类型要求
Rule 6-4-8每个switch语句至少必须有一个case子句要求
迭代语句
Rule 6-5-1for循环中必须有且仅有一个循环计数器,该计数器不得为浮点类型要求
Rule 6-5-2如果不是使用--或++修改循环计数器,那么在条件中,循环计数器只能作为<=、<、>或>=的操作数要求
Rule 6-5-3不得在条件或语句中修改循环计数器要求
Rule 6-5-4应通过以下其中一种方式修改循环计数器:--、++、-=n或+=n;其中n在循环过程中保持不变要求
Rule 6-5-5不得在条件或表达式中修改循环控制变量(循环计数器除外)要求
Rule 6-5-6除了在语句中被修改的循环计数器外,其他的循环控制变量应具有bool类型要求
跳转语句
Rule 6-6-1goto语句引用的标号(label)必须在同一代码块或上级代码块中声明要求
Rule 6-6-2goto语句只得跳转到同一函数主体中在其后声明的标号(label)要求
Rule 6-6-3continue语句只能在是良构(well-formed)的for循环中使用要求
Rule 6-6-4对于任何迭代语句,用于终止循环的break或goto语句不得超过一个要求
Rule 6-6-5函数结尾必须有且仅有一个退出点要求

声明

说明符
Rule 7-1-1不修改的变量必须使用const修饰要求
Rule 7-1-2如果函数形参不被修改,那么必须将相对应的形参的指针或引用声明为const指针或const引用要求
枚举声明
Rule 7-2-1具有enum底层类型的表达式只应包含与枚举的枚举器对应的值要求
命名空间
Rule 7-3-1全局命名空间只能包含main、命名空间声明和extern “C”声明要求
Rule 7-3-2标识符main不得用于除全局函数main之外的函数要求
Rule 7-3-3头文件中不得存在未命名的命名空间要求
Rule 7-3-4不得使用using指令要求
Rule 7-3-5同一命名空间中对一个标识符的多个声明不得跨越该标识符的using声明要求
Rule 7-3-6不得在头文件中使用using指令或using声明(不包括类作用域或函数作用域的using声明)要求
asm声明
Rule 7-4-1所有汇编器的使用必须备有文件强制
Rule 7-4-2只能使用asm声明引入汇编器指令(assembler instructions)要求
Rule 7-4-3必须独立封装汇编语言要求
链接规范
Rule 7-5-1函数不应返回在该函数中定义的自动变量(包括形参)的引用或指针要求
Rule 7-5-2不得将自动存储对象的地址赋给在该对象不复存在后仍然可能存在的另一个对象要求
Rule 7-5-3如果一个形参是通过引用或const引用传递的,那么函数不得返回该形参的引用或指针要求
Rule 7-5-4函数不应直接或间接调用自身建议

声明符

一般规则
Rule 8-0-1初始化声明符列表(init-declarator-list)只能包含一个初始化声明符;成员声明符列表(member-declarator-list)只能包含一个成员声明符要求
声明符的含义
Rule 8-3-1覆盖虚拟函数中的形参必须使用与被它们覆盖的函数相同的默认实参,否则不得指定任何默认实参要求
函数定义
Rule 8-4-1不得使用省略号定义函数要求
Rule 8-4-2函数的重新声明中用作形参的标识符必须与原声明中的标识符相同要求
Rule 8-4-3所有从具有非void返回类型的函数中退出的路径都应该具有包含表达式的显式return语句要求
Rule 8-4-4函数标识符必须用来调用该函数,否则必须加上前缀“&”要求
初始化器
Rule 8-5-1所有变量在使用前都必须先定义一个值要求
Rule 8-5-2数组和结构体进行非零初始化时,必须使用大括号来指示和匹配结构要求
Rule 8-5-3枚举器列表中,不得将=结构用于显式初始化非首位成员之外的成员,除非所有的项都被显式初始化要求

成员函数
Rule 9-3-1const成员函数不得返回对 *类数据* 的非const指针或引用要求
Rule 9-3-2成员函数不得返回指向类数据的非const句柄要求
Rule 9-3-3如果一个成员函数可以是静态的,那么就必须将其设为静态,否则,如果该函数可以是const的,那么就必须将其设为const要求
联合体
Rule 9-5-1不得使用联合体要求
位域
Rule 9-6-1需要对代表一个位域的位进行绝对定位时,必须记录位域的行为和包装强制
Rule 9-6-2位域必须是bool类型,或显式无符号/有符号整数类型要求
Rule 9-6-3位域不得具有enum类型要求
Rule 9-6-4已命名的有符号整数类型的位域长度必须超过一位要求

派生类

多个基类
Rule 10-1-1不应使用虚拟基来派生类建议
Rule 10-1-2只有在用于菱形层次结构(diamond hierarchy)时,才能声明一个基类为虚拟基类要求
Rule 10-1-3可访问基类在同一层次结构中不能同时为虚基类和非虚基类要求
查找成员名称
Rule 10-2-1在一个多重继承层次结构中,所有可访问的实体名称都应该是唯一的建议
虚拟函数
Rule 10-3-1在整个继承层次结构中,每个虚拟函数在每个路径中的定义不应超过一个要求
Rule 10-3-2每个覆盖虚拟函数都必须用关键字virtual来声明要求
Rule 10-3-3如果虚拟函数被声明为纯虚函数,则该虚拟函数只能被纯虚函数覆盖要求

成员访问控制

一般规则
Rule 11-0-1在非POD类中,成员数据必须是私有的要求

特殊成员函数

构造函数
Rule 12-1-1不得在一个对象的构造函数或析构函数的主体中使用该对象的动态类型要求
Rule 12-1-2所有类构造函数都应明确地调用它们所有直接基类和虚拟基类的构造函数建议
Rule 12-1-3所有可以用基本类型的单个实参进行调用的构造函数都应被显式声明要求
复制类对象
Rule 12-8-1复制构造函数(copy constructor)只得用来初始化它的基类以及它所属的类的非静态成员要求
Rule 12-8-2在抽象类中,复制赋值运算符必须被声明为受保护的(protected)或私有的(private)要求

模板

模板声明
Rule 14-5-1非成员泛型函数只能在不是关联命名空间(associated namespace)的命名空间中声明要求
Rule 14-5-2如果模板构造函数只有一个形参,且为泛型形参,那么必须声明一个复制构造函数要求
Rule 14-5-3如果模板赋值运算符有一个泛型形参,那么必须声明一个复制赋值运算符要求
名称解析
Rule 14-6-1在一个有依赖基的类模板中,必须使用带修饰的标识符或this->来引用任何可能在该依赖基中查找到的名称要求
Rule 14-6-2通过重载解析选择的函数必须被解析为翻译单元中先前声明的函数要求
模板实例化与专门化
Rule 14-7-1所有类模板、函数模板、类模板成员函数和类模板静态成员至少必须被实例化一次要求
Rule 14-7-2对于任何给定的模板专门化,使用专门化的模板实参对该模板进行显式实例化,不得导致程序非良构(ill-formed)要求
Rule 14-7-3模板的所有部分专门化和显式专门化的声明必须与主模板的声明在同一文件要求
函数模板专门化
Rule 14-8-1重载的函数模板不得被显式专门化要求
Rule 14-8-2对函数调用可行的函数集不应包含任何函数专门化,或者应只包含函数函数专门化建议

异常处理

一般规则
Rule 15-0-1异常只得用于错误处理强制
Rule 15-0-2异常对象不应具有指针类型建议
Rule 15-0-3不得使用goto或switch语句将控制权转移到try或catch块中要求
抛出异常
Rule 15-1-1throw语句的赋值表达式本身不得导致抛出异常要求
Rule 15-1-2不得显式抛出NULL要求
Rule 15-1-3空的抛出(throw;)只得在捕获(catch)处理程序的复合语句中使用要求
处理异常
Rule 15-3-1只有程序启动后和终止前才能报告异常要求
Rule 15-3-2至少应该有一个异常处理程序来捕获所有未经处理的异常建议
Rule 15-3-3对于类构造函数或类析构函数,其函数尝试块实现的处理程序不得引用该类或其基类的非静态成员要求
Rule 15-3-4对于在代码中显式抛出的每个异常,在所有可能导致该异常的调用路径上,都必须有一个兼容类型的处理程序要求
Rule 15-3-5必须始终通过引用来捕获类类型的异常要求
Rule 15-3-6如果在一个尝试捕获(try-catch)语句或函数尝试块中,为一个派生类以及它的部分或全部基类提供了多个处理程序,那么应按从最终派生类到基类的顺序排列这些处理程序要求
Rule 15-3-7如果在一个尝试捕获语句或函数尝试块中提供了多个处理程序,那么所有省略号(catch-all)处理程序必须在最后发生要求
异常规范
Rule 15-4-1如果一个函数与异常规范(exception-specification)一起声明,那么该函数在其他翻译单元中的所有声明必须以相同的类型标识(type-id)集声明要求
异常函数
Rule 15-5-1类析构函数不得随着异常退出要求
Rule 15-5-2当函数的声明包含一个异常规范时,该函数只能抛出指定类型的异常要求
Rule 15-5-3不得隐式调用terminate()函数要求

预处理指令

一般规则
Rule 16-0-1文件中的#include指令之前只能是其他预处理指令或注释要求
Rule 16-0-2只能在全局命名空间中对宏进行#define和#undef要求
Rule 16-0-3不得使用#undef要求
Rule 16-0-4不得定义类函数宏要求
Rule 16-0-5传递给类函数宏的实参不得包含形似预处理指令的标记要求
Rule 16-0-6在定义类函数宏时,每个实参的实例都必须以小括号括起来,除非它们是#或##的操作数要求
Rule 16-0-7未定义的宏标识符不得用于#if和#elif预处理指令,除非是作为defined预处理运算符的操作数要求
Rule 16-0-8如果#标识符是行中的第一个标记,则其后应紧接预处理标识符要求
条件包含
Rule 16-1-1defined预处理运算符只能使用两种标准形式之一要求
Rule 16-1-2所有的 #else、#elif 和 #endif 预处理指令必须都必须和对应的 #if 或 #ifdef 指令位于同一文件中要求
源文件包含
Rule 16-2-1预处理器只得用于文件包含和#include防范(include guard)要求
Rule 16-2-2C++的宏只得用于#include防范、类型限定符或存储类标识符要求
Rule 16-2-3必须提供#include防范要求
Rule 16-2-4头文件名称里不得出现'、"、/*或//字符要求
Rule 16-2-5头文件名称里不能出现\字符建议
Rule 16-2-6#include 预处理指令必须后接<filename>或"filename"要求
宏替换
Rule 16-3-1在一个宏定义中最多只得出现一个#或##预处理器运算符要求
Rule 16-3-2不应使用#或##预处理器运算符建议
Pragma指令
Rule 16-6-1必须记录所有#pragma指令的使用强制

库的引入

一般规则
Rule 17-0-1标准库中保留的标识符、宏和函数不得被定义、重定义或取消定义要求
Rule 17-0-2不得重复使用标准库中宏和对象的名字要求
Rule 17-0-3不得重写标准库中函数的名称要求
Rule 17-0-4所有库代码必须遵守MISRA C++规则强制
Rule 17-0-5不得使用setjmp宏和longjmp函数要求

语言支持库

一般规则
Rule 18-0-1不得使用C语言库要求
Rule 18-0-2不得使用库<cstdlib>中的函数atof、atoi 和 atol要求
Rule 18-0-3不得使用库<stdlib.h>中的函数 abort、exit、getenv 和 system要求
Rule 18-0-4不得使用库<ctime>中的时间处理函数要求
Rule 18-0-5不得使用库<cstring>中的无界函数要求
实现属性
Rule 18-2-1不得使用宏offsetof要求
动态内存管理
Rule 18-4-1不得使用动态堆内存分配要求
其他运行时支持
Rule 18-7-1不得使用<csignal>中的信号处理功能要求

诊断库

错误代码
Rule 19-3-1不得使用错误指示器errno要求

输入_输出库

一般规则
Rule 27-0-1不得使用输入/输出流库<cstdio>要求