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编码规范全解读 - Misra C 概述相关推荐

  1. Misra-C编码规范全解读 - 总目录

    总目录 欢迎大家来到雪云飞星的<Misra-C 2012编码规范全解读>.Misra C 作为汽车行业乃至嵌入式行业的著名编码规范,被众多的厂商采用并遵守.其能有效的拦截潜在的编码风险,帮 ...

  2. Misra-C编码规范全解读 - 前言

    前言 ->返回总目录<- 博主雪云飞星是一名汽车行业的嵌入式高级软件工程师,AutoSAR行业知名专家.著有<AutoSAR入门到精通系列讲解>专栏,被业界誉为最容易理解的Au ...

  3. Misra-C编码规范全解读 - Dir 3 需求的可追溯性

    Dir 3 需求的可追溯性 ->返回总目录<- Dir3.1 所有的代码都应该可追溯到需求文档 必要性 适用范围 参考 必选项 C90 C99 无 3.1.1 概述 说直白一点就是我们定了 ...

  4. misra c编码规范个人整理总结/misra c 2012中文版-个人总结-【方便查询】

    整理MISAR-2012错误解决方法-带编号,本文根据文档整理了部分常见的MISAR-2012错误及解决方法,顺序是错误码顺序,参考文档<LDRA standards for C/C++> ...

  5. 汽车业内软件编码规范--MISRA C简介

    MISRA (The Motor Industry Software Reliability Association),中文名称为汽车工业软件可靠性联会,是英国的一个跨国汽车工业协会,其成员包括了大部 ...

  6. .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类...

    .Net基础--程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll则需 ...

  7. .Net Core 编码规范

    .Net Core 编码规范 标签: 未分类 概述 规范制定原则 方便代码的交流和维护. 不影响编码的效率,不与大众习惯冲突. 使代码更美观.阅读更方便. 使代码的逻辑更清晰.更易于理解. 术语定义 ...

  8. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  9. 最全面的C/C++编码规范总结

    2019独角兽企业重金招聘Python工程师标准>>> 对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读 ...

  10. 阿里巴巴编码规范解读(五)-MySQL数据库

    MySQL数据库 第五部分 MySQL数据库 建表规约 1.[强制] 2.[强制] 3.[强制] 4.[强制] 5.[强制] 6.[强制] 7.[强制] 8.[强制] 9.[强制] 10.[推荐] 1 ...

最新文章

  1. 会议报到和撒离时间算会期_【明日报到】2020中国(三门峡)食用菌新产品新技术博览会工作人员开始分装资料...
  2. Python 删除列表中的重复数据
  3. Qt三种方式实现FTP上传功能
  4. 编程学不来就去当产品经理,没那么简单!
  5. 【英语学习】【Level 08】U02 Movie Time L4 From the page to the big screen
  6. 使用JavaScript(jQuery或Vanilla)选中/取消选中复选框?
  7. 博途v16tia项目服务器,博途V16与scout TIA
  8. 把C#对象转换为json字符串
  9. (转)Windows API User32.dll详细介绍
  10. php 计算字段的和,php – foreach中计算列的总和
  11. 基于matlab的黑体辐射特性分析,MATLAB 黑体辐射规律的研究
  12. 什么是视频结构化?视频结构化有什么作用
  13. CTF-安全杂项-BAT公司信息查询系统
  14. Redis之时间轮机制(五)
  15. proxmox的安装
  16. 云南马铃薯种薯质量追溯系统
  17. 最小二乘法多元函数超曲面拟合(python)
  18. 说说北大软微那些事儿
  19. ubuntu22.04卡住死机并且键盘鼠标均无反应
  20. juniper防火墙常用配置

热门文章

  1. BT5的默认用户名和密码
  2. 地表蒸散发(ET)数据下载网站汇总
  3. OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
  4. 计算机专业初试,2019初试-计算机专业基础综合-考试大纲
  5. 浪曦视频《J2EE测试使用指南Junit3.8详解》学习总结
  6. 那点房事(难以齿口)
  7. 中国生态城市规划行业“十四五”规划与前景规模预测报告2022-2028年版
  8. Android内存泄漏检测工具大全
  9. QSS实践汇总(3)——QComboBox样式(风格)
  10. Idea2021激活码