【车载开发系列】MISRA-C概念介绍

【车载开发系列】MISRA-C概念介绍

【车载开发系列】MISRA-C概念介绍

  • 【车载开发系列】MISRA-C概念介绍
    • 一. 什么是MISRA-C
    • 二. MISRA-C的作用
    • 三. Misra C的优势
    • 四. 使用Misra C的负面效应
    • 五. MISRA-C标准说明
      • 1)语言扩展
      • 2)类型限制
      • 3)常量
      • 4)声明与定义
      • 5)初始化
    • 六. 总结

一. 什么是MISRA-C

MISRA-C是一组针对C语言编程的编码规范,旨在提高软件质量、可靠性和可维护性。MISRA代表Motor Industry Software Reliability Association(汽车工业软件可靠性协会),该协会最初为汽车行业开发了这些规范。虽然最初是为汽车行业设计的,但MISRA-C规范已经成为其他行业的编码标准,如航空航天、医疗设备和铁路系统。

MISRA-C规范包含了一系列关于C语言编码的规则和指导,这些规则旨在减少代码中的错误、提高代码的可读性,并确保代码在不同的编译器和平台上的可移植性。这些规则通常涵盖了诸如类型转换、指针使用、内存分配、代码风格等方面。在一些高度安全和可靠性要求的行业,如汽车电子控制单元(ECU)、航空航天和医疗设备领域,遵循MISRA-C规范是一种常见的实践,有助于降低软件缺陷的风险。

MISRA-C规范的最新版本通常会随着时间的推移而更新,以反映新的技术、实践和行业标准的变化。

二. MISRA-C的作用

一辆高端汽车整车的代码行数已经突破了1亿行。那么如果这些代码都写得乱七八糟,会有顾客敢买吗?为了规范大家的写法,增强可读性,可维护性,减少代码可能出现的低级错误,于是MISRA协会制订了Misra C规范,用于规范大家的编程,提高代码整体的可靠性。

MISRA-C 编程规范的推出迎合了很多汽车厂商的需要,因为一旦厂商在程序设计上出现了问题,用来补救的费用将相当可观。

1999 年 7 月 22 日,通用汽车公司( General Motors)就曾经因为其软件设计上的一个问题,被迫召回350 万辆已经出厂的汽车,损失之大可想而知。

三. Misra C的优势

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

1)提升可靠性

2)提升可读性

3)提升可移植性

4)提升可维护性

5)提升安全性

四. 使用Misra C的负面效应

可能会牺牲执行效率

可能会牺牲代码空间

不太注重编程风格

例如misra c:2004明确指出:不得使用联合体。这是因为,在联合体的存储方式(如位填充、对齐方式、位顺序)上,各种编译器的处理可能不同。

很多的大公司都有自己相应的代码编程规范。针对C语言尤其严谨,比如比较著名的有:华为C语言编程规范、阿里C语言编程规范和MisraC等。但是侧重点又各有不同,各类规范可能会有交集,也有自己独特的地方存在,但是大家都是致力于让程序员能写出一手更好的代码:华为、阿里的编程规范更加注重代码风格的规范。这些代码的编程规范在Misra C中是没有的。

五. MISRA-C标准说明

1)语言扩展

1 汇编语言应该被封装并隔离。

使用具体的宏定义对汇编语言进行封装

2 源代码应该使用 /... / 类型的注释

所有的C语言代码都要使用/.../类型的注释

2)类型限制

1 单纯的char类型应该只用做存储和使用字符值。

2 signed char和unsigned char类型应该只用做存储和使用数字值。

3 应该使用指示了大小和符号的 typedef以代替基本数据类型。

4 位域只能被定义为unsigned int或singed int类型,unsigned int类型的位域至少应该为 2 bits长度。

3)常量

不可以使用八进制与八进制的escape序列。

4)声明与定义

4.1 函数应当具有原型声明,且原型在函数的定义和调用范围内都是可见的。

4.2 不论何时声明或定义了一个对象或函数,它的类型都应显式声明。

4.3 函数的每个参数类型在声明和定义中必须是等同的,函数的返回类型也该是等同的。4.4 如果对象或函数被声明了多次,那么它们的类型应该是兼容的。

4.5 头文件中不应有对象或函数的定义。

4.6 外部对象或函数应该声明在唯一的文件中

4.7 具有外部链接的标识符应该具有准确的外部定义。一个对象在外部只能有一个准确的定义

4.8 在文件范围内声明和定义的所有对象或函数应该具有内部链接,除非是在需要外部链接的情况下。

4.9 static 存储类标识符应该用于具有内部链接的对象和函数的定义和声明。

4.10 当一个数组声明为具有外部链接,它的大小应该显式声明或者通过初始化进行隐式定义

5)初始化

5.1 所有自动变量在使用前都应被赋值

5.2 应该使用大括号以指示和匹配数组和结构的非零初始化构造

5.3 在枚举列表中,"="不能显式用于除首元素之外的元素上,除非所有的元素都是显式初始化的。

六. 总结

MisraC是汽车制造业嵌入式C编码标准。

很多代码静态检查的工具里面都参照了MisraC,MisraC更加注重代码的功能性、稳定性和可维护性。

当然MisraC的标准远不止上面这些。

相关推荐
康谋自动驾驶1 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车
C++ 老炮儿的技术栈2 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
inputA2 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
JANYI20183 小时前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
2301_786001263 小时前
汽车四缸汽油机曲柄连杆机构设计关键技术研究
汽车·毕业设计
小_楠_天_问4 小时前
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化
c语言·嵌入式硬件·mcu·esp32·arduino·pwm·esp32-s3
秋山落叶万岭花开ღ4 小时前
C语言顺序表应用详解:从理论到实践
c语言
2301_803554525 小时前
c++和c的不同
java·c语言·c++
小狗祈祷诗5 小时前
day20-线性表(链表II)
c语言·数据结构·链表
白露秋486 小时前
C——五子棋小游戏
c语言·游戏