MISRA-2012 规则整理

2023-11-09

说明:为了方便标准的对照,标题从8.1开始

目录

8.1 一个标准C环境

8.2 不使用的代码

8.3 注释

8.4 字符集

8.5 标识符

8.6 类型

8.7 常量

8.8 声明与定义

8.9 初始化

8.10 基本数据类型

8.11 指针类型转换

8.12 表达式

8.13 副作用

8.14 控制语句表达式

8.15 控制流

8.16 Switch语句

8.17 函数

8.18 指针和数组

8.19 重叠存储

8.20 预处理指令

8.21 标准库

8.22 资源


8.1 一个标准C环境

1.1 、必需。程序应不包含违反标准C语法和限制的内容,也不应超出执行的编译限制。

1.2 、建议。不应使用语言扩展。

1.3 、必需。不应该出现未定义或是临界的未指定行为。

8.2 不使用的代码

2.1、必需。不应包含未执行的代码。

2.2、必需。不应该有死代码。

2.3、建议。不应包含被声明但未使用的类型。

2.4、建议。不应包含未使用的标签声明。

2.5、建议。不应包含未使用的宏定义。

2.6、建议。函数中不应包含未使用的标记。

2.7、建议。不应有未使用的函数参数。

8.3 注释

3.1、必需。不允许嵌套注释。

3.2、必需。不允许在//注释中进行行拼接。

8.4 字符集

4.1、必需。八进制和十六进制转义字符序列应被终止。

4.2、建议。三字母词不应使用。

8.5 标识符

5.1、必需。外部标识符应区分开。

5.2、必需。标识符声明在同一作用域且位域应被区分。

5.3、必需。声明于内部作用域的标识符不应隐藏外部作用域的标识符。

5.4、必需。宏标识符应被区分。

5.5、必需。标识符要区别于宏名。

5.6、必需。Typedef名应是独一无二的标识符。

5.7、必需。标签应是独一无二的标识符。

5.8、必需。定义有外部链接的对象或函数的标识符应是独一无二的。

5.9、建议。定义有内部链接的对象或函数的标识符应是独一无二的。

8.6 类型

6.1、必需。位域只能被定义为一个合适的类型。C90:无符号整型和有符号整型。C99:除上述两个以外还有布尔类型。

6.2、必需。单比特命名的位域不应是有符号类型。

8.7 常量

7.1、必需。不要使用八进制常量和八进制的转义字符串;

7.2、必需。所有以无符号类型表示的整型常量都应加上u或U后缀。

7.3、必需。小写字母l不应用于文字后缀。

7.3、必需。除非对象类型是指向字符常量的指针,否则字符串不应赋给对象。

8.8 声明与定义

8.1、必需。类型应被显式声明。

8.2、必需。函数应以原型形式命名参数。

8.3、必需。所有对象和函数的声明需要使用完全相同的名字和参数。

8.4、必需。当定义有外部链接的对象或函数时,兼容声明是可见的。

8.5、必需。外部变量或函数应被在仅一个文件内被声明过。

8.6、必需。有外部链接的标识符应有一个确切的外部定义。

8.7、建议。若函数和对象仅被一个单元引用,最好不定义外部链接。

8.8、必需。静态存储类说明符应在所有具有内部链接的对象和函数的声明中使用。

8.9、建议。如果一个对象的标识符仅在一个函数内出现,该对象应被定义在一个块域中。

8.10、必需。内联函数定义时应有静态存储类。

8.11、建议。当有外部链接的数组被定义,它的大小应明确表示。

8.12、必需。枚举列表内的枚举值应独一无二。

8.13、建议。可能的话指针最好指向一个const类型的变量。

8.14、必需。restrict限定词不应使用。

8.9 初始化

9.1、强制。自动变量在使用前应该被赋值。

9.2、必需。结构和和联合体的初始化应在大括号内完成。

9.3、必需。数组不应被部分初始化。

9.4、必需。一个对象的元素不应被多次初始化。

9.5、必需。若一个数组对象被指定初始化,那么数组大小应明确表示。

8.10 基本数据类型

10.1、必需。操作数不应是不合适的数据类型。

10.2、必需。表达式字符之间不应使用加减法。

10.3、必需。不应将表达式的值赋给不同类型或更窄的类型。

10.4、必需。一个运算符的两个操作数应是相同类型。

10.5、建议。表达式的值不应被转换成一个不合适的类型。

10.6、必需。复合表达式的值不应赋给一个有更宽类型的对象。

10.7、必需。若复合表达式参与数学运算,那么另一个操作数不应是更宽的基本类型。

10.8、必需。复合表达式的值不应被转换为不同的基本类型分类或更宽的基本类型。

8.11 指针类型转换

11.1.必需。不应在函数指针和其他类型间进行转换。例外:空指针可被转换为函数指针。函数指针可被转换为void类型。函数可以被隐式转换为该函数类型的指针。

11.2、必需。指向不完全类型的指针与其他类型间的转换不应出现。

11.3、必需。不同类型指针间不应转换。

11.4、建议。不应将指针转换为整形变量。

11.5、建议。不应直接将void类型指针转换为指向对象的指针。

11.6、必需。算数类型和void类型指针不应转换。

11.7、必需。指向对象的指针和一个非整型算数类型不应转换。

11.8、必需。指针指向的const和volatile修饰的变量不应被删除。

11.9、必需。宏“NULL”是整数型空指针常量的唯一允许形式

8.12 表达式

12.1、建议。表达式中的运算符优先级应明确。

12.2、必需。移位运算符的右手操作数应该小于左手操作数的基本类型的位宽。

12.3、建议。不应使用逗号运算符。

12.4、建议。常量表达式的计算不应导致无符号整数的回绕。

8.13 副作用

13.1、必需。初始化列表不应包含持续副作用。

13.2、必需。表达式的值和他的持续副作用应在允许的计算顺序下保持相同。

13.3、建议。包含自增或自减的完整表达式应无其他除自增自减外的潜在副作用。

13.4、建议。不应使用赋值运算的结果。

13.5、必需。逻辑与和逻辑或的右手操作数不应包含持续副作用。

13.6、强制。sizeof运算符的操作数不应包含任何有潜在副作用的表达式。

8.14 控制语句表达式

14.1、必需。循环计数器不应有浮点型数据。

14.2、必需。for循环应完整。

14.3、必需。控制语句不应一成不变。

14.4、必需。if语句和迭代表达式应有布尔类型。

8.15 控制流

15.1、建议。不应该使用goto语句。

15.2、必需。goto语句应跳跃至同一函数后定义的语句处。

15.3、必需。被goto语句引用的任何标志都应在同一块内定义或任何包含goto语句的块。

15.4、建议。不应有多个break或goto语句来结束迭代语句。

15.5、建议。一个函数在其结尾应该有单一的退出点,即一个函数最多有一个return语句。

15.6、必需。迭代语句和选择语句的主体应是复合语句。

15.7、必需。if elseif语句应由一个else语句结束。

8.16 Switch语句

16.1、必需。所有switch语句都要是完整的。

16.2、必需。switch标签应仅用于最紧密封闭的复合语句作为switch语句的主体时。

16.3、必需。每个switch分支都要有一个break语句。

16.4、必需。每个switch语句都要有一个default标签。

16.5、必需。default标签应出现在switch语句的第一个或最后一个标签处。

16.6、必需。每个switch语句都要至少包含两个分支。

16.7、必需。switch表达式不应有布尔类型。

8.17 函数

17.1、必需。头文件内的功能不可使用。

17.2、必需。函数不能调用自身,不管是直接或者间接的,即不允许递归调用;

17.3、必需。函数应被明确定义。

17.4、必需。所有函数退出位置都应有相应的返回语句,除了返回值为void类型的函数。

17.5、建议。函数参数中若有数组,在调用函数的时候数组大小应与定义时的数组大小相同。

17.6、强制。定义数组时不应在[]中包含static修饰的变量。

17.7、必需。非空返回值的函数的返回值应被使用。

17.8、建议。函数参数不应被修改。

8.18 指针和数组

18.1、必需。数组的索引应该是指针数学运算中唯一可允许的方式。

18.2、必需。只有基类型相同的指针间才可以相减。

18.3、必需。除非指针指向同一个对象,否则不应使用关系运算符进行比较。

18.4、建议。不要使用+、+=和-=操作符来应用于指针类型表达式。

18.5、建议。不要定义两级以上的指针。

18.6、必需。具有自动存储功能的对象的地址不得复制到第一个对象停止存在后仍然存在的另一个对象。

18.7、必需。数组定义时必需指定大小。

18.8、必需。变长数组不应使用。

8.19 重叠存储

19.1、强制。一个对象不得分配或复制到一个重叠的对象。

19.2、建议。union关键字不应被使用。

8.20 预处理指令

20.1、建议。#include指令前应只存在预处理器指令或注释。

20.2、必需。头文件名中不应包含‘,’和注释字符。

20.3、必需。#include后应跟随或“filename”。

20.4、必需。宏名不应与关键字冲突。

20.5、建议。不要使用#undef。

20.6、必需。宏的参数中不应出现类似预处理指令的符号。

20.7、必需。由宏参数扩展产生的表达式应用括号括起来。

20.8、必需。#if或#elif预处理指令的控制表达式应赋值为0或1.

20.9、必需。#if或#elif中控制表达式使用的标识符在赋值前应被#define。

20.10、建议。#和##预处理器操作符不应使用。

20.11、必需。宏参数在紧随#后后续不得有##紧跟该参数。

20.12、必需。宏参数用作#或##操作符的操作数,这本身就是收到进一步的宏替换,应仅被用作这些操作符的操作数。

20.13、必需。以#开头的一行应是有效的预处理指令。

20.14、必需。所有的#else、#elif和#endif预处理指令应该同与他们相关的#if或者#ifdef指令放在相同的文件中。

8.21 标准库

21.1、必需。#define和#undef不得用于保留标识符或保留宏的名字。

21.2、必需。不应定义保留的标识符或宏名。

21.3、必需。的allocation和deallocation函数不应使用。

21.4、必需。不应使用标准头文件。

21.5、必需。不应使用标准头文件。

21.6、必需。标准库中的输入输出函数不应使用。

21.7、必需。不应使用的atof,atoi,atoll函数。

21.8、必需。不应使用的abort,exit,getenv和system函数。

21.9、必需。不应使用的bsearch函数。

21.10、必需。不应使用标准库中的时间和日期函数。

21.11、必需。不应使用标准头文件。

21.12、建议。不应使用中的异常处理功能。

8.22 资源

22.1、必需。用标准库函数动态获得的资源应显式释放。

22.2、强制。仅用标准库函数分配的内存需要被释放。

22.3、必需。同一文件不应在同一时间在不同流中读写。

22.4、强制。不应尝试在以只读形式打开的流中写入数据。

22.5、强制。指向文件对象的指针不应被引用。

22.6、强制。在相关流关闭后文件指针的值不应使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MISRA-2012 规则整理 的相关文章

随机推荐

  • 使用uni-app开发叮咚买菜的一些笔记

    本项目纯开源免费 商品信息均来自网络 如有侵权 请联系作者 我会及时删除 前一段 看到一个大佬写的叮咚买菜 挺好 于是乎自己在家也琢磨了一下 自己搞了一版本 记录一些uni app的开发事项 纯属个人总结 不对之处 还请指教 功能不是很全面
  • 硬件工程师-MOS管

    目录 DS等效电阻 Rdson MOS管 GS电容 MOS管的损耗 MOS管体二极管 讨论MOSFET的GS电容问题 MOSFET的GS电容对管子开通特性的影响 MOS管GS下拉电阻 MOS管的等效模型 MOSFET是如何进行导通的 Rds
  • OpenCV-Python 图像平滑处理1:卷积函数filter2D详解及用于均值滤波的案例

    一 图像平滑处理简介 图像平滑处理属于图像空间滤波的一种 用于模糊处理和降低噪声 模糊处理经常用于图像预处理任务中 例如在 大 目标提取之前去除图像中的一些琐碎细节 以及桥接直线或曲线的缝隙 模糊处理后的图像 可以通过阈值处理 形态处理等方
  • 线性稳压芯片LR78L05U参数

    属性 参数值 商品目录 线性稳压芯片 输出电流 100mA 稳压器数 1 输出类型 Fixed 压降 最大值 1 7V 40mA 工作温度 55 125 工作电源电流 最大值 6 1mA 输入电压 最大值 30V 输出配置 Positive
  • Unity 在编辑模式下退出游戏

    实现在编辑器环境下退出编辑器 在非编译器环境下退出游戏 我们需要判断当前是否在编辑器环境中 在unity中是使用预处理的方式判断当前的环境 常用的预处理标识符如下 标识符 解释 UNITY EDITOR 只在编辑器中编译 UNITY AND
  • el-popover 通过js手动控制弹出框显示、隐藏

    el popover 通过js手动控制弹出框显示 隐藏 说明 element ui 2 x中 el popover的显示隐藏有4种触发方式 click focus hover manual 分别是点击 聚焦 悬浮 手动 正常情况这几个触发方
  • 总结/笔记-逻辑函数封装

    逻辑函数拆分业务 将同一组件中独立的业务代码通过函数做封装处理 提高代码的可维护性 步骤 1 命名函数 use业务名 js 2 用函数封装业务逻辑 3 函数内 return 数据 方法 4 组件中 调用函数使用 封装业务逻辑函数 compo
  • java文件名命名的规则,Java文件名及其他命名规则

    http bbs csdn net topics 70157841 关于JAVA源文件命名的问题 Java文件命名 java程序是由类组成的 java应用程序必须有一个包含main方法的public类 main方法是程序的入口 java源文
  • UncaughtExceptionHandler加Process 让应用程序不异常崩溃退出

    我们在开发应用程序时难免会遇到出现没有被try catch抓住的RunTimeException信息 从而导致程序异常崩溃退出 大大的影响了用户体验 那么有没有什么方法能避免这一现象呢 网上一查资料 果然有 UncaughtExceptio
  • 延迟渲染到最终结果---大象无形(11.3.1)--2,PrePass预处理阶段--<2>大致工作流程

    正如上文所言 对静态物体和动态物体分别处理 一 静态物体 1 设置渲染状态 只计算像素深度 不计算颜色 具体内容是 关闭颜色写入 打开深度测试与深度写入 2 渲染三个绘制列表 1 只绘制深度的列表PositionOnlyDepthDrawL
  • java 内存同步_Java同步的内存影响

    小编典典 简而言之 就是 JSR 133的解释太过分了 这不是一个严重的问题 因为JSR 133是非规范性文档 不属于语言或JVM标准 而是 只有文档解释了一种可能的策略 该策略 足以 实现内存模型 但通常不是 必需的 最重要的是 有关 缓
  • java:变量(二)变量的基本类型

    二 整型与浮点型细节 1 组成 整型变量是由符号位和数位两部分组成 浮点变量是由符号位 指数尾 尾数位组成 整型和浮点型变量的首位都是符号位 用来表示数据的正负 2 整型浮点型变量的长度和取值范围是固定的 事实上同一语言的基本数据类型的长度
  • 云优化:您需要知道的一切

    在不考虑云优化的情况下将开发工作迁移到云端有点类似于吃 PB J 花生酱 果酱 三明治 只不过没有果酱 虽然花生酱已经够美味了 但您错过了把这一切结合在一起的要素 如果您想确保最大限度地利用您的云支出并消除任何可能拖慢速度的低效率事项 那么
  • 在idea中集成redis

    https www cnblogs com yiMro p 13529150 html SpringBoot Redis 基本配置及使用 Test public void TestRedis Jedis jedis new Jedis 19
  • [docker学习笔记] 11.docker网络模式及容器间网络通信

    docker的容器之间需要进行业务通信 11 1 默认网络 初始安装docker 之后 有三种网络 可以通过 docker network ls 查看 root localhost docker network ls NETWORK ID
  • 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码 奇偶校验码 海明校验码 CRC校验码 一 奇偶校验码二 海明校验码三 CRC校验码 计算机系统运行时 各个部之间要进行数据交换 交换的过程中 会有发生误码的可能 即0变成1或1变成0 由于计算机的储存是通过二进制代码来实现的的
  • C#连接云服务器MySql数据库

    环境 vs2017 第一步 在主窗口代码区新建一个类 用于连接数据库 在开发过程中其他窗口 常常也需要 对数据库进行操作 如果在每一个窗口的代码区域都连接一次数据库的话 就会很麻烦 所以在主窗口先用一个公共类连接了数据库 其他窗口就可以直接
  • go 进阶 请求代理相关: 一. 基于原生HTTP实现请求代理

    目录 一 代理基础概念了解 什么是正向代理 什么是反向代理 二 基于原生HTTP实现代理 简单正向代理示例 简单反向代理示例 上方代理中可能存在的问题 一 代理基础概念了解 什么是正向代理 是一种客户端的代理技术缩写为 forward pr
  • HarmonyOS云开发基础认证

    单选 答案 Cloud DB的数据同步模式包括缓存模式和本地模式 应用可以仅使用缓存模式 或者本地模式 也可以同时使用缓存模式和本地模式 正确 True Cloud DB服务在通过OnSnapshotListener类中的onSnapsho
  • MISRA-2012 规则整理

    说明 为了方便标准的对照 标题从8 1开始 目录 8 1 一个标准C环境 8 2 不使用的代码 8 3 注释 8 4 字符集 8 5 标识符 8 6 类型 8 7 常量 8 8 声明与定义 8 9 初始化 8 10 基本数据类型 8 11