MISRA C_2012规则翻译、解读、示例

2023-11-08

目录

一、MISRA C_2012介绍

二、MISRA C_2012每条规则翻译、解读、示例

Rule 1系列,标准C环境准则

Rule 1.1 程序不应包含任何违反标准C语法和约束的内容,也不应超过实现的转换限制

Rule 1.2 不应使用语言扩展

Rule 1.3 不应出现未定义或关键的未指定行为

Rule 2系列,未使用的代码的处理


一、MISRA C_2012介绍

先摘录一段百度百科里的说法:

MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。针对C++语言也有对应的标准MISRA C++。

MISRA C一开始主要是针对汽车产业,不过其他产业也逐渐开始使用MISRA C:包括航天、电信、国防、医疗设备、铁路等领域中都已有厂商使用MISRA C。

MISRA C的第一版《Guidelines for the use of the C language in vehicle based software》是在1998年发行,一般称为MISRA-C:1998.。MISRA-C:1998有127项规则,规则从1号编号到127号,其中有93项是强制要求,其余的34项是推荐使用的规则。

在2004年时发行了第二版的MISRA C的第一版《Guidelines for the use of the C language in critical systems》(或称作MISRA-C:2004),其中有许多重要建议事项的变更,其规则也重新编号。MISRA-C:2004有141项规则,其中121项是强制要求,其余的20项是推荐使用的规则。规则分为21类,从“开发环境”到“运行期错误”。

2012年发布第三版,为当前最新有效的C语言规范版本,称为MISRAC:2012。 

MISRA版本

发布年份

C语言版本

指令 数量

规则 数量

指南 总数

1998

1998

C90

不详

127

不详

2004

2004

C90

不详

142

不详

2012

2012

C99

16

143

159

2012 AMD-1

2016

C99

17

156

173

2012 AMD-2

2020

C11

17

158

175

Misra C不能100%保证程序不出问题,但是能尽可能的预防,总结一下,基本上使用Misra C具有以下五个维度的优势:

  • 提升可靠性
  • 提升可读性
  • 提升可移植性
  • 提升可维护性
  • 提升安全性

若要保证我们的程序能符合Misra C编码规范,一方面是在开发初期写代码的时候尽量按照Misra C规范来写,一方面是在后期通过一些代码检测工具来检测我们的代码是否符合Misra C规范。

因此我们平时要多积累一些Misra C规范的约束经验,尽量在后期检测中少出一些问题,毕竟出了问题还要花时间来重新翻规范重新改。

二、MISRA C_2012每条规则翻译、解读、示例

在这里我只翻译和解读158条规则,一些重要的规则尽量给出正确的示例,个人能力有限,因此不保证翻译的准确性,主要还是用于自己能更加的熟悉规则,能直接开发出符合规范的代码,当然,这个工作不是一天能完成的,反正我有空就会在这里更新的。

Rule 1系列,标准C环境准则


Rule 1.1 程序不应包含任何违反标准C语法和约束的内容,也不应超过实现的转换限制

  • 原文:Rule 1.1  The program shall contain no violations  of the standard C syntax and constraints, and shall not exceed the implementation’s tr anslation limits
  • 级别:低
  • 解读:程序只能使用C语言及其库中所选标准版本中指定的特性
  • 示例:比如你用C90的编译器你就要符合C90的规则和特性,而不能去使用到C11的特性,其实即使你使用了,编译器也不支持,但不一定都能检测出来,具有一定的风险

Rule 1.2 不应使用语言扩展

  • 原文:Rule 1.2  Language extensions should not be used
  • 级别:低
  • 解读:不要用编程语言扩展属性,否则会降低程序的可移植性
  • 示例:无

Rule 1.3 不应出现未定义或关键的未指定行为

  • 原文:Rule 1.3  There shall be no occurrence of undefi ned or critical unspecified behaviour
  • 级别:中
  • 解读:

任何引起未定义或未指定行为的程序都可能不以预期的方式运行。在许多情况下,这样做的结果是使程序不可移植,但也可能发生更严重的问题。例如,未定义的行为可能会影响计算的结果。如果软件的正确操作依赖于这个计算,那么系统安全可能会受到损害。如果未定义的行为只在很少的情况下出现,那么这个问题就特别难以检测。许多MISRA C指南的设计都是为了避免某些未定义和未明确的行为。例如,对规则11.4、规则11.8和规则19.2的遵守确保了在C语言中不可能创建一个非const限定的指针,该指针指向用const限定类型声明的对象。这避免了C90 Undefined 391和C99 Undefined 61。

  • 示例:英文原版pdf的附录H列出了所有未定义和关键的未指定行为,以及MISRA C防止它们发生的指南。

Rule 2系列,未使用的代码的处理


Rule 2.1 项目不应该包含运行不到的代码

  • 原文:Rule 2.1  A project shall not contain unreachable code
  • 级别:高
  • 解读:如果一个程序没有表现出任何未定义的行为,那么无法到达的代码就不能被执行,也不能对程序的输出产生任何影响。因此,无法到达的代码的存在可能表明程序逻辑中的错误。  无法到达的代码会占用目标机器的内存空间,可能会导致编译器在围绕无法到达的代码传输控制时选择更长的、更慢的跳转指令。而且在循环中,它可以防止整个循环驻留在指令缓存中。
  • 示例:switch中某个case分支是永远运行不到的,程序员应该删除这种代码。

Rule 2.2 项目不应该包含死代码

  • 原文:Rule 2.2  There shall be no dead code
  • 级别:高
  • 解读:任何可以删除掉但是不影响程序正常运行的代码都是无效代码,由于无效代码可能被编译器删除,所以它的存在可能会引起混乱。
  • 示例:类似以下这种的程序永远运行不到的代码都叫无效代码。
if(0)
{
    function();
}

Rule 2.3 项目不应该包含未使用的类型声明

  • 原文:Rule 2.3  A project  should not contain unused ty pe declarations
  • 级别:低
  • 解读:如果声明了类型但没有使用,那么审阅者就不清楚该类型是冗余的还是错误地未使用。
  • 示例:使用typedef定义了一个数据类型但是从未使用过。
typedef int local_type;  /* 从未使用的话将违反规则 */

Rule 2.4 项目不应该包含未使用的标签声明

  • 原文:Rule 2.4  A project should not contain unused ta g declarations
  • 级别:低
  • 解读:如果一个标签已经声明但没有使用,那么审阅者就不清楚这个标签是多余的还是错误地没有使用。
  • 示例:使用typedef定义了一个结构体类型标签或者使用enum定义了一个enum类型标签但是都从未使用过。
enum state { S_init, S_run, S_sleep };   /* 从未使用state标签的话将违反规则 */

typedef struct record_t  /* 从未使用record_t标签的话将违反规则 */
{
  uint16_t  key;
  uint16_t  val;
} record1_t;

typedef struct  /* 这种是可以的,不会违反规则 */
{
  uint16_t  key;
  uint16_t  val;
} record2_t;

 

 

 

 

 

 

 

 

 

 

 

 

 

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

MISRA C_2012规则翻译、解读、示例 的相关文章

随机推荐

  • 第2课:Scratch介绍

    什么是Scratch Scratch 一款免费的图形化少儿编程工具 由麻省理工学院设计开发 它是完全免费的 它将一大片代码变成一个个功能模块 界面非常清晰 小朋友可以像搭积木一样做出自己的游戏程序 对于低年级的小朋友很容易上手 而且很容易培
  • 使用k8s业务在十几分钟无人使用时,访问报错问题

    业务放入k8s测试中发现当十几分钟没有访问 再次访问时就会报错 刷新后业务正常 一直访问故障不复现 通过整体测试发现Redis自动断开连接 redis在使用net网络模式时会出现自动断开问题 升级Redis版本后解决
  • 傅里叶变换,高通,低通滤波

    傅里叶变换 傅里叶变换的作用 高频 变化剧烈的灰度分量 例如边界 低频 变化缓慢的灰度变量 例如一片大海 滤波 低通滤波器只保留低频 会使头像模糊 高通滤波器只保留高频 会使图像细节增强 opencv主要就是cv2 dft 和cv2 idf
  • 机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真

    文章目录 四轴机械臂实物 Robotic ToolBox机械臂建模 1 建立机械臂的D H表 建立机械臂坐标系 根据坐标系建立D H表 2 代码建模 机械臂运动学仿真 1 正运动学仿真 2 逆运动学仿真 为了能够实现机械臂的运动轨迹规划 同
  • Github Page 个人主页——自定义域名

    1 前言 看本文前请确认已部署好基础的静态网页 参考上篇文章 Github Page 个人主页 项目部署 部署好的个人网页若使用 username github io 访问 会让别人很难记住 这时就可以使用自定义域名来绑定仓库了 本文将介绍
  • Centos 安装 Kafka 后台启动 教程

    安装 官网 http kafka apache org downloads 1 下载 Python wget http mirrors tuna tsinghua edu cn apache kafka 0 11 0 0 kafka 2 1
  • html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放

    我有 body background url images background svg 期望的效果是该背景图像的宽度等于页面的宽度 高度变化以保持比例 例如 如果原始图像恰好是100 200 任何单位 且正文宽度为600px 则背景图像最
  • 2021-11-02 B1026 简单的时间转换显示和将小数四舍五入

    B1026 简单的时间转换显示和将小数四舍五入 原题 1026 程序运行时间 15 分 要获得一个 C 语言程序的运行时间 常用的方法是调用头文件 time h 其中提供了 clock 函数 可以捕捉从程序开始运行到 clock 被调用时所
  • java没有报错,但编译失败。

    这段代码总是编译失败 但是idea没有报错 这东西是抽象类 解决办法 jdk版本问题 虽然都是1 8 换成了333就没问题了 个人经验 换成版本高的试试
  • C++: 'identifier': identifier not found [Compiler Error C3861]

    问题 模板类继承模板类时 子类无法直接访问父类成员 会报如下错误 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3861 insertAsLast 找不到标识符 DSA D Code DSA DSA Queue h 8 环境 V
  • 解决Vscode中unresolved import “XXX” 问题

    正常导入同级目录的 py文件 报黄色警告 原因 在Vscode中 import后面跟着的 必须是全路径 将import后面的文件路径 修改成全路径 便不会有unresolved import XXX 警告
  • adele心理学

    人生中最大的谎言就是不活在此时此刻 纠结过去 关注未来把微弱而模糊的光打向人生整体 自认为看到了些什么 你之前就一直忽略 此时此刻 只关注根本不存在的过去和未来 对自己的人生和无可替代的刹那撒了一个大大的谎言 我们应该更加认真地过好 此时此
  • 华为OD机试 C++ 异常的打卡记录

    描述 我们的目标是查找出那些异常的员工打卡记录 异常的定义是 打卡所用的设备号与员工注册的设备号不匹配 同一个员工两次打卡的时间间隔小于60分钟 但距离超过5km 你会得到一个字符串数组 里面包含每条打卡记录 格式为 工号 时间 分钟 距离
  • gcc与g++的安装和使用

    首先大致介绍一下gcc和g 在此之前 你需要先安装gcc与g 然后才能进行指令操作 命令如下 sudo yum install y gcc c 在命令行输入以上指令后 gcc g 便成功安装了 gcc是一个专门用来编译链接c语言的编译器 g
  • @EnableAspectJAutoProxyAop注解实现

    转载 https www cnblogs com foreveravalon p 8653832 html 在这个注解比较流行的年代里 当我们想要使用spring 的某些功能时只需要加上一行代码就可以了 比如 EnableAspectJAu
  • Git学习:git 生成 patch的命令

    个人理解 patch就是打补丁 通过git工具把代码的差分 生成patch文件 然后通过git工具可以直接把patch文件的内容 merge到代码里面 生成patch的命令 git diff gt patch 本地变更 git diff 的
  • python-面向对象

    一 什么是面向对象 1 什么是面向对象 概念 根据模板 创建一个类 实例化一个类 面向对象 2 面向对象的好处 可重复使用 实例化类 容易修改 只用修改类的模板 3 面向对象的特点 封装 继承 多态 4 类名首字母必须大写 5 面向对象的案
  • 详细解说 STL 排序(Sort)

    详细解说 STL 排序 Sort 0 前言 STL 为什么你必须掌握 1 STL提供的Sort 算法 1 1 所有sort算法介绍 1 2 sort 中的比较函数 1 3 sort 的稳定性 1 4 全排序 1 5 局部排序 1 6 nth
  • 避障雷达IO输出记录

    避障雷达的使用首先需要在软件上划分区域 区域一共可以划分为3个 代码实现部分 第四个雷达处理算法 后边雷达 int alarm int a int b int array 8 for int i 0 i lt 8 i b a 1 a uns
  • MISRA C_2012规则翻译、解读、示例

    目录 一 MISRA C 2012介绍 二 MISRA C 2012每条规则翻译 解读 示例 Rule 1系列 标准C环境准则 Rule 1 1 程序不应包含任何违反标准C语法和约束的内容 也不应超过实现的转换限制 Rule 1 2 不应使