您的位置 首页 解答

DSP编程技巧之12-揭开编译器奥秘面纱之代码标准MISRA-C

如果我们自己编写了一个程序,程序能正常编译,运行起来也实现了我们期望的输出,那是不是这个程序就很完善了呢?对于工业产品来说,“好”、“能用”和&ld

  假如咱们自己编写了一个程序,程序能正常编译,运转起来也完成了咱们希望的输出,那是不是这个程序就很完善了呢?关于工业产品来说,“好”、“能用”和“完善”,或许说“标准”,乃至是代码的“安全”,明显不是一个层面的东西。由于C言语尽管是咱们开发嵌入式运用的最主要东西之一,可是C言语并非是专门为嵌入式体系规划,相当多的嵌入式体系较一般计算机体系对软件安全性有更严苛的要求;例如在那些对安全性要求很高的体系中,如飞行器、轿车和工业操控中,只需代码的作业稍有误差,就有或许形成严重的财产损失或许人员伤亡。

  那么怎么衡量咱们的代码是否满意某些标准,是“安全的”、“强健的”呢?此刻咱们就能够依据具体的运用来查找相关的职业标准。举个比方,在工业范畴中,MISRA-C就是在的某些职业中要求恪守的职业标准。MISRA C是由轿车工业软件牢靠性协会(MISRA,motor industry software reliability association)提出的C言语开发标准。其意图是在增进嵌入式体系的安全性及可移植性。针对C++言语也有对应的标准MISRA C++。MISRA C一开始主要是针对轿车工业:假如咱们去参与近几年的有关轿车职业的根据主动代码生成技能和根据模型的规划技能的讲座、研讨会等等,无一例外都会听到有关MISRA-C 2004,乃至是MISRA-C 2008、MISRA-C 2012等更新版别的介绍。此外,其他工业也现已逐步开始运用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类,从“开发环境”到“运转期过错”。一般以为,假如能够彻底恪守这些标准,则你的C代码是易读、牢靠、可移植和易于保护的。最近许多嵌入式开发者都以MISRA C来衡量自己的编码风格,比方闻名的uC/OS-II就满意地宣称自己99%恪守MISRA标准。现在有许多东西宣称能够查看代码和MISRA规矩相容性,不过MISRA没有相关认证的程序。相关东西能够协助运用者评价和比较查看的成果,也会供应一些可契合MISRA-C规矩的攻略,可是现在大部分的东西对静态代码剖析的东西查看基本能完成,对动态代码剖析则还不能完美完成。

  考虑到MISRA-C:2004有141项规矩,其间仅强制要求就有121项,其他的20项是引荐运用的规矩,明显让咱们仅仅是把这么多规矩阅读一遍就需求花费很多的时刻,更不必提手艺对照规矩来查看咱们的软件了。幸亏咱们运用的DSP编程环境CCS供应了相应的选项,使得编译器能够主动查看咱们的代码是否违反了MISRA-C的相关规矩,并供应给咱们具体的确诊与正告信息。

  在C言语的标准ANSI C 和 ISO C之后,又产生了更新的C99以及最新的C11 (ISO/IEC 9899:2011),可是由于最新版别的标准从推出到各大编译器厂家支撑以及开发者的习惯都需求必定的时刻,所以现在最常用的仍然是ANSI C或许C99。与此相似, 尽管MISRA-C的标准最弱现已有最新的2012,可是人们议论和运用最多的仍然是2004版别,所以在CCS的编译器选项里仍以MISRC-C:2004的规矩为准。

  启用了–check_misra={all|required|advisory|none|rulespec}的选项使能MISRC-C:2004规矩查看之后,还能够在代码中能够合作相关的预处理指令使能某些代码的查看/中止查看功用,包含:

  #pragma CHECK_MISRA ("{all|required|advisory|none|rulespec}");

  #pragma RESET_MISRA ("{all|required|advisory|rulespec}");

  其间,CHECK_MISRA用来使能或许制止对MISRC-C:2004规矩的查看,它的效果与–check_misra是共同的。RESET_MISRA则用来复位MISRC-C:2004规矩查看的状况。

  rulespec参数则能够用来指定咱们运用哪些MISRC-C:2004中的哪些规矩来进行特色的查看,包含:

  [-]X 使能 (或许制止) X主题下各个规矩的查看。(主题包含变量、字符、初始化等)

  [-]X-Z 使能 (或许制止) 从X到Z主题下各个规矩的查看

  [-]X.A 使能 (或许制止) X主题下规矩A的查看。

  [-]X.A-C 使能 (或许制止) X主题下从规矩A到规矩C的查看。

  举例说明:–check_misra=1-5,-1.1,8.2-4的意义是:

  查看从主题1到主题5的规矩。(不清楚的网友能够去查找MISRA标准,1.环境;2.言语扩展;3.文档;4.字符集;5.标识符)

  制止规矩1中1.1条意图规矩(规矩1.1(强制): 一切代码都有必要遵循ISO 9899:1990 “Programming languages – C”,由ISO/IEC 9899/COR1:1995,ISO/IEC 9899/AMD1:1995,和ISO/IEC9899/COR2:1996 修订),规矩1中的其它规矩坚持有用。

  查看主题8中的规矩2到4.为了便利,咱们能够列出这几条规矩的界说(其内容较长,有爱好的网页请在查找引擎中检索):

  主题8: 声明与界说

  规矩8.2(强制): 不管何时声明或界说了一个目标或函数,它的类型都应显式声明。

  规矩8.3(强制): 函数的每个参数类型在声明和界说中有必要是同等的,函数的回来类型也该是同等的。

  规矩8.4(强制): 假如目标或函数被声明晰屡次,那么它们的类型应该是兼容的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/118097.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部