关注+星标公众,不错过精彩内容

编排 | strongerHuang

微信公众号 | 嵌入式专栏

C语言的标准有很多,之前给大家分享过相关的内容,比如:C89、C99标准ANSI C、ISO C、Standard C标准等。

可能你在一些地方还看到过:MISRA C:2012,MISRA C++:2008,那你知道这是什么吗?

今天分享的就是另外一种C语言标准:MISRA C.

嵌入式专栏

1

MISRA C

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语言规范版本,称为MISRA C:2012。


MISRA C 版本历史

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

嵌入式专栏

2

MISRA C:2012(修订版2)

当前最新有效的C语言规范版本为MISRA C:2012,下面来讲讲其修订版2。

MISRA C工作组发布了对MISRA C:2012的修订版,以支持称为“C11”的C标准,并正式批准为ISO/IEC 9899:2011。C11已得到广泛使用,对于一直推迟迁移到C11的项目和组织,这是一个广受欢迎的公告。C11还取代了C99(标准ISO/IEC 9899:1999),并已被C18(标准ISO/IEC 9899:2018)取代。除了更新的C语言准则之外,MISRA C工作组还发布了MISRA 2020合规性指南。

MISRA C:2012(修订版2)现在引用ISO/IEC 9899:2011,并包含C语言更新,为可能使用但受限制的功能和受禁止的功能提供指导,除非其存在您的团队软件审查过程已批准的偏差。在制定修订版2的过程中,还获得了利用先前的补充内容纠正任何已知问题的机会。MISRA工作组的任务不止是提供指导,以防止发生不可预测的行为,减少或消除编码缺陷并在嵌入式软件系统的环境中促进代码安全、安全性、可移植性和可靠性。

新的MISRA C:2012标准:

添加了适用于C11中新功能的新MISRA规则的一个示例,即规则1.4,“不得使用紧急语言功能。” 如果使用设施<threads.h>和_Thread_local存储类说明符,则可能是这种情况的一个实例。该规则将使用违反类别类型“必需”标记C11语言结构。

C11标准化了可能在多核平台上运行的多线程程序的语义,以及使用原子变量的轻量级线程间通信。使用线程本地的全局内存,其中已标识出未定义和未指定行为的实例,包括未满足预期的已定义行为。

向前迈进并符合MISRA C:2012(修订版2),如果我使用_Thread_local,不仅需要进行偏离,而且还需要采取保证措施来解决危害安全性的行为。

_Generic关键字是另一个不应使用的C11语言新功能,它可能表现出不良行为,并且一些人发现C11标准在某些情况下含糊不清。_Generic运算符是一种宏重载。它用于帮助程序员将任何宏都用作通用宏,以使其更高效。下面的代码行显示_Generic关键字如何用于声明不同类型的数据类型的任何宏,以及如何将其声明为不同方法的泛型。以下面的VOL宏示例为例;VOL(x)根据x的类型转换为VOLc(x),VOLl(x),VOL(x)或VOLf(x)。

#define VOL(x) _Generic((x), char: VOLc, long double: VOLl, default: VOL, float: VOLf)(x)

安全编码

安全漏洞的一个常见原因是使用了<stdlib.h>中定义的标准库函数系统。MISRA C:2012(修订版2)添加了新的规则21.21,该规则规定不得使用标准库函数系统。系统调用是一个阻塞函数,用于执行子进程和命令,等待子进程终止并返回其退出值。认识到原型为“int系统(const char *command);”不需要是单个命令,而可以是一个管道或一系列管道。(例如,系统("pngtopnm \"My Picture.png\" | pnmtoxwd > fout.xwd && xwud fout.xwd");)由于可变命令是由用户提供的数据构成的,因此攻击者可能会发现 引用并在父级上下文中执行任意命令。一些建议的措施可能是利用预定的命令字符串或一起绕开系统调用,而使用spawn代替。

合规报告

对于声称符合MISRA的要求,有一些书面指南,这些指南在过去的几年中不断完善和修订。本文档的最新版本是MISRA Compliance 2020,它于2月发布。从较高的角度来看,适当报告了使用良好的软件开发过程的使用情况,准确地应用了哪些指南以及执行方法的有效性的列表,包括偏差的程度或程度,以及为了声称MISRA符合要求,必须考虑到项目外开发的所有软件组件的状态。Parasoft DTP提供了专用的报告扩展,完全符合MISRA Compliance标准的要求。DTP将指导您完成构建准则执行计划(GEP)和准则重新分类计划(GRP)的过程,并自动生成准则合规摘要(GCS)以及已批准偏差的完整列表。自动化报告消除了繁琐的手工工作,使组织能够遵循MISRA编码准则现在强制执行的合规性流程。

最后

还有其他新的MISRA C:2012(修订版2)规则,例如_Noreturn函数说明符、_Atomic类型说明符、_Alignas对齐说明符和_Alignof运算符,非常引人注目。使用这些类型说明符将触发类别“必需的违规”,并且将不被使用,从而解决了C11覆盖和安全漏洞的问题。此外,还进行了许多修订版2更新和文本替换,以澄清和改进标准。同样,再次提醒您非常重要的一点是,与该标准一起,用户现在可以遵循MISRA Compliance 2020指南的强制性和补充性法规遵循版本。感谢MISRA工作组继续做出色的工作,并为软件界做出了巨大贡献。

免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------

后台回复『嵌入式C语言』『科普知识』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

MISRA C:2012 又是什么标准?相关推荐

  1. 带你走近MISRA C:2012

    汽车软件与C语言 随着软件定义汽车概念的兴起,汽车软件开发的工作量开始呈指数级增加,当前车载软件代码量已经达到1亿-3亿行.这是一个什么概念呢,相当于比Windows系统还高出一个数量级.据调查,大部 ...

  2. Simulink自动代码生成:如何标准化的建模?以MAB,MISRA C 2012建模规范为例

    目录 为什么要规范建模 MAB,MISRA C2012建模规范步骤 常用的规范总结 生成代码配置 总结 为什么要规范建模 MathWorks 咨询委员会 (MAB) 规范规定了在 Simulink®  ...

  3. 2012服务器系统标准版,windowsserver2012标准版_windows2012_server2012_微软镜像_5分享

    这是Windows 8的服务器版本,并且是Windows Server 2008 R2的继任者.该操作系统已经在2012年8月1日完成编译RTM版,并且在2012年9月4日正式发售. 用户界面 简化服 ...

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

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

  5. GB9706.1-2007+2020和IEC60601-1:2005 3.0+2012 3.1标准主要差异解析

    目录 GB9706.1-2007医用电气设备 第1部分:安全通用要求 GB9706.1-2020医用电气设备 第1

  6. 回顾“90后”——MISRA的25年岁月

    谈起MISRA这个名字,大家应该都不陌生,但,我们真的了解它吗?从90年代初期MISRA组织的发起至2020年,MISRA已走过25个年头.25年过去,90后已成长为现代社会发展的中坚力量,同样作为& ...

  7. 为什么您应该使用基于标准的开发实践

    为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...

  8. c++编码规范_汽车嵌入式软件测试——嵌入式软件标准及规范简介

    以前接手过一个软件项目,翻开模型和代码之后的几天,把模型开发人员问候了一个遍.此处略过若干字......不禁要问,建模规范.编码规范不是很好吗?为什么不用?制定相关规范的出发点就在于保证每个人能在短时 ...

  9. 什么是MISRA?如何满足该行业标准?

    MISRA:汽车工业软件可靠性联会,其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的.高可靠性的嵌入式软件.MISRA C则是由MISRA提出的针对嵌入式C语言开发标准,目的是提高嵌入式系统的 ...

最新文章

  1. KD树和LSH局部敏感哈希
  2. Google 开源 AdaNet:快速灵活的轻量级 AutoML 框架
  3. (笔记)Linux内核学习(五)之中断推后处理机制
  4. HDU-1274 展开字符串
  5. mybatis :Criteria 查询、条件过滤用法
  6. spring事务传播,隔离级别,
  7. 来自微软华人的软件人生经历:功夫在身外
  8. python字典嵌套循环_python使用for循环更新嵌套字典值
  9. 选择器、像素和百分比、颜色单位、文档流-css基础
  10. DH算法原理深入详解
  11. 台式计算机入门基础知识,电脑基础知识:新手入门最全电脑知识干货
  12. vb.net 随窗口改变,缩放控件大小以及保持相对位置
  13. feishu-飞书api
  14. 游艇租用问题算法c语言,租用游艇问题  算法设计分析
  15. 新加坡南洋理工大学招募博士生、博士后、研究工程师和研究科学家
  16. Chinese Segmentation Introduction
  17. PythonWeb全栈开发介绍
  18. 考研那些事——那些年,我们一起度过的猪狗不如的生活
  19. CodeCraft-19 and Codeforces Round #537 (Div. 2)
  20. 联想k910 android6.0,联想K910官方系统rom固件刷机包

热门文章

  1. GB28181开源项目WVP部署详细流程
  2. 越南用户最受欢迎的付款方式
  3. 越南使用的越南文unicode编码范围
  4. Jekyll搭建个人博客 韩俊强的博客
  5. 带UI界面的学生管理系统
  6. ehchache验证缓存过期的api_SpringBoot - 缓存的使用详解1(使用Ehcache 2.x缓存)
  7. java swing 收银系统,Swing做的简单超市收银系统
  8. 网站管理助手4.0 mysql_网站管理助手v4.0 建站流程
  9. 计算机专业押韵口号16字,最牛班级口号霸气押韵16字
  10. 简历石沉大海?程序员简历到底该怎么写?