Misra-C编码规范全解读 - Misra C 概述

MisraC是一种针对汽车制造业嵌入式C编码的规范,旨在提升代码的可靠性、可读性、可移植性和安全性。它强调功能性、稳定性和可维护性,如要求每个switch必须有break,操作符两侧数据类型一致等。MisraC通过限制某些可能引发错误的编程方法,使代码更规范,便于排错和维护。虽然初期可能增加程序员的工作量,但长期来看能提高代码质量,广泛应用于汽车、飞机等领域。
摘要由CSDN通过智能技术生成

Misra C 概述

->返回总目录<-

1 什么是MisraC规范

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

  • 华为、阿里的编程规范更加注重代码风格的规范
    - 比如每行代码不能超过120个字、代码缩进、空格和大括号等的使用,这些是MisraC这样的规范中没有的
  • MisraC更加注重代码的功能性、稳定性和可维护性
    - 比如所有的switch的case里都要有break,以防止错误逻辑的意外发生
    - 再比如操作符两边的数据类型需要一致,以防止隐式类型转换会发生与程序员想法不一致的情况(比如uint8类型的a就不能和int16类型的b做">" "<" "=="的比较)

那什么是MisraC规范呢?我们摘录一段百度百科里的说法:

MISRA-C,汽车制造业嵌入式C编码标准,最早版本为MISRA-C:1998,该标准后来的版本增加了编码规范的覆盖范围到其他高安全性系统,当前最新版本为MISRA-C:2012
MISRA-C,汽车制造业嵌入式C编码标准
1998年汽车工业软件可靠性联合会(MISRA)发布的针对汽车工业软件安全性的C语言编码规范,成为MISRA-C:1998。此编码规范最初只是针对汽车制造业的嵌入式开发,从MISRA-C:2004开始扩大覆盖范围到其他高安全性系统,最新版本为MISRA-C:2012

这里我们不得不提到汽车行业:目前嵌入式行业里,使用嵌入式编码最多的就是汽车行业了,一辆高端汽车整车的代码行数已经突破了1亿行(不比一架飞机的代码量少)。那么如果这些代码都写得乱七八糟,试问当前看博客的朋友,你敢买吗?为了规范大家的写法,增强可读性,可维护性,减少代码可能出现的低级错误,于是MISRA协会针对C语言的MisraC规范,用于规范大家的编程,提高代码整体的可靠性。而目前由于MisraC规范的知名度越来越高,其在飞机、机器人、无人机等其他的嵌入式行业也开始推行起来,成为了全球公认的嵌入式编程规范
再说回MisraC本身,其本质就是C语言的一个子集,在本身C语言的基础上,加上了一些约束,我们可以理解为C - - (‾◡◝)。但是这个C - - 去掉的是一些容易让人出错的编程方法,保留了大家常用的写法。大家都知道C语言实现一种功能有很多的方式,对于一些容易出错的,MisraC便尽量让大家保持一致,便于排错和分析,也便于其他人的阅读和维护

2 C语言编程的痛点

C语言编程是一个开放的过程,这个过程中往往会因为各种各样的因素导致程序的运行和设想有偏差。目前没有任何一种语言可以做到能直接理解程序员心中所想,并直接转化为可运行的代码;但是对于C语言这样的偏底层的语言来讲,太过开放,可能导致的结果就是更加不可能一次就把代码写成功。我们可以将这些C语言编程的问题归纳为如下痛点:

  1. 程序员编码过程的失误
    人非圣贤,谁人都有过将==写成=的经历吧,然后找半天原因,最后无意间发现了这个bug
  2. 程序员对C语言了解不充分
    C语言的内容还是不少的,编码要求我们的代码要100%按要求运行。但是实际程序员编码过程中,最常用的语法无法覆盖100%,有些语法或者用法可能好几年才会用到一次。因此,程序员可能在编码过程中产生对C语言的错误理解,导致逻辑错误。比如:运算符的优先级,大家能第一时间确认c = a + b << 1中,+<<哪个先运算吗?为了避免这类问题,MisraC要求在含混不清的代码中加上括号,比如这样:c = (a + b) << 1来防止误解
  3. C语言编译器的差异导致程序运行不一致
    C语言发展了很多年了,但是仍然无法避免因为编译器的不同而产生最终结果的差异,甚至背离程序员编码的初衷。因此,为了更好的代码移植性和可靠性。MisraC会有很多的规定来限制写法,保证代码在所有编译器上输出的程序都能有相同的运行结果
  4. 编译器本身的错误
    编译器本身也是一个程序,是程序就可能会出错,编译器的编译可能会导致错误。因此减少一些编译器容易出错的写法,也可以提高代码可靠性
  5. 运行时的错误
    C语言本身运行时检查能力比较弱,特别是一些栈溢出,超范围等的问题的检查很难定位

3 使用MisraC的优势

MisraC不能100%保证程序不出问题,但是能尽可能的预防,上面说了很多了。这里我们总结一下,基本上使用MisraC具有以下五个维度的优势:

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

当然,MisraC不是万能的,在使用初期,程序员很可能因为修改MisraC而耽误一些时间,这时不可避免的

4 本专栏内容概览

总目录中我们可以看到,2012规范主要分为DirectivesRule两个部分

  • 指令(Directives)主要是一些不能提供执行符合性检查所需的完整描述的指导原则。为了能够进行检查,需要提供额外的信息,例如可能在设计文档或需求规范中提供的信息。静态分析工具可以帮助检查指令的遵从性,但是不同的工具可能对什么构成不遵从性有不同的解释

例子
Dir 4.9 规定: 应该优先使用函数,而不是类函数宏,因为它们是可以互换的
但是我们在程序中又会经常使用到这样的宏:#define MIN(a, b) a < b ? a: b
那究竟什么样的宏算是类函数宏,是需要人为定义的。比如长度超过10行,或者用了do{} while(0)这种语法的,而这个标准是要根据实际情况判定,在MisraC中不做具体定义

  • 规则(Rule)是一个指导方针,它提供了需求的完整描述。不需要任何其他信息就可以检查源代码是否符合规则

例子
Rule 15.5 规定: 一个函数只能有一个退出条件语句,并且放在函数最后
退出条件语句也就是我们经常用的return语句,禁止多个return的使用,有利于理清楚函数的逻辑,方便阅读。而这条规则没有任何的歧义,也不用人为定义什么,MisraC已经定义的很清楚了,因此属于Rule里面

接下来,我们就要将所有的MisraC条款都为大家梳理一遍,大家可以当成工具书查看

附:返回总目录的传送门如下
->返回总目录<-

MISRA-C-2012是一种针对C编程语言的软件开发规范,旨在帮助开发人员编写高质量、安、可靠的嵌入式系统软件。该规范由MISRA(Motor Industry Software Reliability Association)组织制定,是一份非常严格和规范的标准,包含了大量的编码规则和指南,旨在避免C语言程序中常见的错误和潜在的安问题。 MISRA-C-2012规范对于内存管理、控制语句、表达式、数据类型、函数等方面都有详细的规则和建议,例如在使用指针时需要遵守的规则、如何使用控制语句、如何定义函数原型等内容。除此之外,该规范还对编码风格、变量名命名规范等方面进行了规定,以便使程序代码更易于理解和维护。 遵守MISRA-C-2012规范的好处是显而易见的,首先可以增加代码的可读性和可维护性,提高程序的质量和稳定性。其次,通过规范化的编码规则,可以有效地减少程序中的bug和错误,提高软件的可靠性和安性。另外,MISRA-C-2012规范还有助于提高软件开发人员的编码水平和技术素养,促进团队之间的协作和沟通。 总的来说,MISRA-C-2012规范对于开发嵌入式系统软件的团队和个人来说是一份非常有价值的参考文档,它能够帮助开发人员编写出更加可靠和高质量的软件,符合行业标准和市场需求。因此,我们应该在软件开发过程中严格遵守MISRA-C-2012规范,以确保软件的质量和安性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪云飞星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值