版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2009-10-27
嵌入式在线
HYPERLINK"javascript:;"保藏|HYPERLINK"javascript:doPrint();"打印
在嵌入式系统的软件设计中,“汇编语言+C语言”早已成为理所当然的经典组合。的确,对于硬件配置来说,汇编语言清楚明白;对于上层设计来说,C语言紧凑高效.这样的搭配能够满意大多数传统嵌入式系统应用的需要。随着技术水平的提高,今日的嵌入式系统也比过去更加深化到人们的日常生活中,大到汽车、飞机、火箭,小到手机、打印机、闹钟、手表,都可以找到嵌入式系统的踪影。然而,这看似一成不变的情况,也在悄然转变。随着网络、多媒体等技术的消灭、进展与普及,对嵌入式系统应用有了新的要求,也给了其他高级语言,格外是C++语言以机会。由此带来的在语言使用中的平安问题,目前虽然还未凸显,但依据以往的阅历来看,终将成为限制行业进展的新瓶颈.已有的C++语言国际标准虽然浩大细致,但作为一个“语言标准”,只能是尽力做得面面俱到,其目标在于构造一个语句合法性的权威依据,以约束人们对于C++的使用。但它并不是针对应用而写的规范,对于可能遇到的平安性问题也无法进行格外深化的探讨,更加没有平安方面的实践阅历支撑.一个针对平安方面的、被国际所认可的使用规范,无疑是C++语言在嵌入式系统中得到广泛应用的坚实基础与助推剂。1C++在嵌入式应用中的机遇与挑战C++作为一门高级语言,人们在提及它时,总难免会谈到C语言.直至今日,很多人对于C++语言的生疏仍然是“C语言的超集"。这是由于C++的起源与C语言有着千丝万缕的联系。1978年,美国贝尔实验室的DennisRitchie和BrianKernighan在BCPL以及其简化版本B语言的基础之上开发了C语言,并合作出版了《TheCProgrammingLan-guage》。C语言飞速得到了大家的认可,并广为流传.1989年,ANSI推出了第一个C语言的标准--X3.159—1989,并被ISO接受,随之发布.ISO/IEC9899—1990。早在C语言标准发布之前,贝尔实验室的BjarneStroustrup就致力于在C语言里增加类、函数类型检查以及其他的一些优秀特征,于1980年发布“CwithClasses"。经过持续的努力,他最终完成了对C语言的改造,由此创生出一门新语言—-C++,并出版了《TheC++ProgrammingLanguage》一书。由于它带来了持续的影响,ISO于1998年发布ISO/IEC14882:1998;几乎同一时间,ANSI也发布了类似标准,这标志着C++作为一门独立语言的标准化得到了官方的认可。统计数据表明,日常生活中一个美国人平均占用8个微掌握器,这些都离不开嵌入式系统的应用。然而嵌入式系统软件技术似乎落后于当前的软件进展形势,近年来才逐渐由汇编语言过渡到面对过程的C语言.但对于面对对象语言的应用还很有限.这一方面是由于嵌入式开发人员多年来应付有限资源的阅历而养成的保守态度,另一方面也是由于长期以来,嵌入式系统应用设计中,人们要花费很多精力在底层硬件的驱动上,功能实现也主要局限在实时操作系统和相关支撑软件的层次,并不涉及过多的应用软件开发。这种在严苛条件下追求效率与实时性的任务,其他的高级语言并没有格外的优势。最近几年,嵌入式系统领域又有了新的进展。首先,随着手机、PDA等消费性电子产品的飞速增长,嵌入式系统的市场规模在飞速扩大,同时越来越多的智能嵌入式应用场合需要互联网的支持,这要求嵌入式系统的软件具有更好的应用性和更高的简洁性;其次,随着芯片等相关领域的技术进步,嵌入式系统工程师们不再需要时时刻刻去考虑资源是否够用了。当面对对象的高级语言参加到嵌入式系统设计中去不再遥不行准时,语言的效率则成为突出的问题。依据《ThinkinginC++》一书的总结,C++与C的效率差别往往在±5%,这使得C++在新一轮的嵌入式应用进展浪潮中占得先机。值得注意的是,尽管自1998年发布最初的C++标准—-ISO/IEC14882:1998以来,每5年都会对此标准进行一次更新,但是由于C++语言过于简洁,以及它经历了长年的演化,直到2004年,没有任何一款编译器完全支持ISOC++。这对于时常要面对各种严苛条件的嵌入式系统应用工程师们来说,是难以忍受的。同时,即使是符合ISOC++标准的语句或者格式,对于实际的应用场合来说,也存在着重大隐患,而不应当被直接接受。因此,人们迫切需要一个正式的基于平安角度考虑的C++语言使用规范.2关于MISRAMISRA(theMotorIndustrySoftwareReliabilityAs—sociation),即汽车工业软件牢靠性协会,于1994.年在英国成立,以“协助汽车工业供应平安、牢靠的软件”为使命,期望通过“规范指南”的形式来约束人们在汽车电子以及其他嵌入式系统开发领域或涉及平安与牢靠性的领域中对于程序语言的使用.由于这些“规范指南”都是从大量工程实践中总结的第一手阅历,因而具有极高的指导意义.经过4年筹备,它在1998年发布了一个针对汽车工业的《GuidelinesfortheUseoftheCLangtlageinVehicleBasedSoftware》,简称“MISRAC:1998’',针对那些满意C语言标准,却存在平安隐患的语言使用习惯,提出了127条规章.由于它很好地解决了C语言国际标准的冗繁性,以及其中对于平安性考虑的不足性,从而得到了广泛的好评。MISRA—C不仅成为众多汽车厂商推崇的行业标准,其影响力更是远远超出了汽车工业,得到铁路、航空航天、国防、医疗等众多领域的认可,成为“最佳实践"解决方案。2004年,MISRA对于已有的规章进行改编与扩充,推出了“MISRAC2004”,首次将该规范指南的对象从汽车工业推广到全部具有平安性要求的系统应用中去,包含了强制规章121条,推举规章20条,并删除了15条旧规章,共计含有141条规章。时至今日,MISRA组织不仅是汽车工业软件规范的权威,其制定的规范指南更得到了嵌入式系统应用领域的广泛认可.考虑到近年来,C++语言在嵌入式系统中的应用越来越多,2005年MISRAC++委员会成立,并于2008年推出针对C++语言的《MISRAC++:2008——GuidelinesfortheUSeoftheC++languageincriticalsys—tems〉〉,以下简称“MISRAC++:2008”.有爱好的读者可以联系相关网站:http://www.misra—/,购买简略的文档.MISRAC++:2008同样从推出之日起,就得到了业内外广泛关注。例如:LDRA软件公司始终跟踪着MIS—RAC++:2008的制定进展,在MISRAC++:2008发布时同步宣称已经完成了对工具套件产品的相应改进,使其符合MISRAC++:2008标准。(LDRA的Testbed产品曾成功用于“神舟"飞船项目的软件测试)3MISRAC++概述作为规范指南,MISRAC++:2008基于ISO/IEC14882:2003的C++语言国际标准,以规章(rule)的形式,给出了相关的建议。它的规章又细分为以下3种类型:①强制型(required),必须符合、允许例外;②推举型(advisory),推举符合;③不容商议 型(document),必须符合、不许例外.MISRAC++:2008中共给出了20个大类的规章(编号并不连续),细分为228条。简略情况如表1所列。文档中全部规章的书写格式如下:每条规章之后都有简略的解释,并给出了一些简略的程序语句作为例子.下面分别针对上述3种规章类别,进行举例说明。规章0-1—1(强制)工程中不允许包含无法触及的代码上述例子里,条件推断中的赋值语句和return语句之后的自增语句都是在任何条件下都无法触及的死代码,不允许这样使用。规章0-1-2(强制)工程中不允许含有永久不会被执行的路径enumec{RED,BLUE,GREEN)col;if(col<=GREEN)//不符合规章,条件永久为真{//Willalwaysget,here}else{//代码永久不会到达这里}由于枚举类型有默认的初始赋值0,1,2,…,故col永久≤GREEN。上述例子中,含有任何条件下都不会被执行的路径,不允许这样使用。规章5-2-10(推举)自增(++)/自减(—-)运算符不应与表达式中其他运算符混合使用诸如下面的例程将导致理解上的混淆以及结果的不确定,在程序设计时应尽可能避开。u8a=++u8b+u8c—;//不符合规章规章0-4-2(不容商议 )对于浮点运算(floating—point)算法的使用,必须给出记录平安的使用浮点算法需要具有较高的数字分析技能和对编译器及硬件对象的深化了解。因此在使用浮点算法时,必须先进行分析:是否必须使用它、实行的方法是否可行、过程是否得到了正确的执行,并将上述结果做出记录。规章16—6-1(不容商议 )全部的库函数代码必须符合MISRAC++上述这些例子只是为了让大家对MISRAC++:2008的3种规章有肯定的生疏,我们会结合相关内容,在接下来的几篇文章中进一步商议 学习。不难发现,很多违反了MISRAC++:2008中规章的例程都是符合C++语言标准的,但出于平安性考虑,应当被禁止或者谨慎使用。通览之后,往往会发现自己平常从未注意的一些编程习惯,都已经被严令禁止.它们有些是明显有碍平安性的,有些则相对隐蔽。然而MISRA的号召力是不容小觑的。以嵌入式实时操作系统μC/OS—II为例,其2.52版本虽然已经于2000年通过了美国航空管理局(FAA)的平安认证,但2003年μC/OS-II的作者就依据MISRAC:1998规范又对源码作了相应的修改,并发布了2.62的新版本,宣称其源代码99%符合MISRAC:1998的要求.4平安性问题对于平安性,MISRA给出以下5种可能的平安问题来源:开发人员的错误、开发人员对于语言的误解、编译器没有依据开发人员的预期工作、编译器本身含有错误、运行错误.这些错误的来源与实际使用的是何种计算机语言没有关系,可以说比较全面地包含了嵌入式系统开发以及其他相关的软件设计中可能导致平安问题的全部渠道。作为C++这样一门面对对象的高级语言(由于其与C的渊源,严格地说,C++是具有某些面对对象特征的过程语言),通过类、函数参数类型检查、模版、格外处理以及派生、继承、多态等手段,使得其在保有高效率的同时,实现了强大的功能,并带来了自顶向下的模块化程序设计理念。但编程灵敏度的提高,也令其代码简洁而易错。与C语言相比,它所面对的平安问题将更为隐蔽,更加难以发现。但就对数据的封装而言,C++远远优于C,只要参照合理的规范指南,进行项目的开发,就可以通过充分发挥C++灵敏的特点,应用到更多更广的工程领域.5行业展望标准与规范从来没有如眼下这般备受重视过.一个权威的标准或规范,不仅将成为相关领域的“金科玉律”,更是行业动向的风向标。可以说正是由于MISRA-C的存在,使得在高级语言种类繁多的今日,C语言的地位仍然无可替代。此次MISRA携着在C语言上的巨大成功,选择了C++语言进行新的规范化尝试,不仅由于C++语言的群众基础深厚,更是表明白嵌入式系统领域内大多数专家的观点:如果说将来能有一门语言取代目前C语言在嵌入式系统应用中的地位的话,也只能是C++语言。一名成功的嵌入式系统工程师,必须是对行业动向极为敏感的,也只有这样,才能在知识爆炸的今日紧跟时代潮流。从使用C语言到使用C++语言是一个巨大的跨越,决不仅仅像使用“增强的C”那么简洁,需要从现在就开头学习。而从学习之初就养成的良好的语言使用习惯,将决定将来进阶的速度与可能性。MISRAC++:2008无疑是培育这样良好习惯的最佳手册MISRA—C:2004HYPERLINK”http://huiorui。blog.163.com/blog/static/61612737200812015733273/"大
HYPERLINK"http://huiorui.blog.163。com/blog/static/61612737200812015733273/"\l”#"中
HYPERLINK"http://huiorui。blog.163.com/blog/static/61612737200812015733273/"小
MISRA(TheMotorIndustrySoftwareReliabilityAssociation汽车工业软件牢靠性协会)MISRA是汽车工业C语言编程指导,是目前公认的最优秀的嵌入式C语言的编码规范,在航空/航天、汽车、医疗、船舶、电信等对软件平安性要求比较高的行业得到了广泛的应用。在1998年版的基础上,MISRA组织最新发布了MISRA-C:2004MISRA-C:2004包括141条规章,其中121条是强制(Required)遵守的,20条是建议(Advisory)遵守的.MISRA官方网站:HYPERLINK"http://www。misra.org.uk/"www.misra。org。ukMISRA规章的简略内容需要购买,印刷版本价格$76,电子版本(PDF)价格£10.全部141条规章的中英文对比如下,请参考。在以后的日子里,我还会间续写一些文章,来介绍某些规章的必要性。11.1
全部代码必须符合ISO9899:1990标准(C编程语言标准).AllcodeshallconformtoISO9899:1990'Programminglanguages—C';1.2
软件不行依靠未定义或未指明的行为.(未指明的行为会产生不行靠性)Norelianceshallbeplacedonundefinedorunspecifiedbehaviour;1.3
只有当目标代码的一般定义界面标准和语言/编译器/汇编器相全都的时候才能使用多种编译器和/或多种语言。Multiplecompilersand/orlanguagesshallonlybeusedifthereisacommondefinedinterfacestandardforobjectcodetowhichthelanguage/compilers/assemblersconform;1。4
编译器、连接器和标识符不能支持超过31个字符的有效性。Thecompiler/linker/Identifiers(internalandexternal)shallnotrelyonsignificanceofmorethan31characters.;
1.5
浮点执行应该符合明确的浮点标准.Floatingpointimplementationsshplywithadefinedfloatingpointstandard;22。1应该封装并隔离汇编语言.Assemblylanguageshallbeencapsulatedandisolated;2.2在源代码中应该只使用‘/*.。。*/’的注释风格.Sourcecodeshallonlyuse/*...*/stylecomments;2。3在注释中不行以使用‘/*’。Thecharactersequence/*shallnotbeusedwithinment;2.4不行以注释掉部分代码.Sectionsofcodeshouldnotbe'commentedout';32。1
必须记录全部与使用执行定义程序有关的行为.Allusageofimplementation—definedbehaviourshallbedocumented;2。2
必须记录字符集与其编码。Thecharactersetandthecorrespondingencodingshallbedocumented;2。3
应该确定、记录并考虑选定编译器中的整数除法。Theimplementationegerdivisioninthechosencompilershouldbedetermined,documentedandtakenintoaccount.;2.4
必须记录并解译全部‘#pragma'指示的使用.Allusesofthe#pragmadirectiveshallbedocumentedandexplained.;2.5
如果代码使用位域,则必须纪录位段的执行定义行为与位段的组装.Theimplementation-definedbehaviourandpackingofbitfieldsshallbedocumentedifbeingreliedupon;2.6
全部执行代码使用的程序库必须符合本文件的规定,并必须经过适当的确认。Alllibrariesusedinproductioncodeshallbewrittentocomplywiththeprovisionsofthisdocument,andshallhavebeensubjecttoappropriatevalidation。;44.1只可使用国际标准化组织(ISO)C语言标准定义的转义-序列。OnlythoseescapesequenceswhicharedefinedintheISOCstandardshallbeused.;3。2
不行使用三符组(??x)。Trigraphsshallnotbeused.;55.1内外标识符不能支持超过31个字符的有效性。Identifiers(internalandexternal)shallnotrelyonthesignificanceofmorethan31characters;
5.2内层范围标识符不行与外层范围标识符同名,否则会屏蔽那个标识符。Identifiersinaninnerscopeshallnotusethesamenameasanidentifierinanouterscope,andthereforehidethatidentifier。;5.3‘Typedef’的名字必须使用唯一的标识符。Atypedefnameshallbeauniqueidentifier.;5。4一个标记符只能用于唯一的标识符。Atagnameshallbeauniqueidentifier;5。5不应该重用带有静态存储的对象或函数标识符.Noobjectorfunctionidentifierwithstaticstoragedurationshouldbereused;5.6一个名字空间的标识符不行以与别的名字空间的标识符同名,结构体和联合体的成员名除外。Noidentifierinonenamespaceshouldhavethesamespellingasanidentifierinanothernamespace,withtheexceptionofstructureandunionmembernames;5。7标识符名字不行以重用。Noidentifiernameshouldbereused;66.1“char”型的变量只能用于字符值的存储和使用。Thetypecharshallbeusedonlyforstorageanduseofcharactervalues;6。2有符号和无符号的“char"型变量只能用于数值的存储和使用。Signedandunsignedchartypeshallbeusedonlyforthestorageanduseofnumericvalues;6。3基本类型应该用指示大小和有无符号的typedef来代替。Typedefsthatindicatesizeandsignednessshouldbeusedinplaceofthebasictypes;6。4位域只能被定义为无符号整型或有符号整型。Bitfieldsshallonlybedefinedtobeoftypeunsignedintorsignedint.;6.5使用有符号整型的位域的大小必须至少是2位。Bitfieldsoftypesignedintshallbeatleast2bitslong。;7
7.1不要使用“零”以外的八进制常量与八进制的转义序列(octalescapesequence).Octalconstants(otherthanzero)andoctalescapesequencesshallnotbeused.;8
8.1函数必须有原型声明,原型对于函数的定义和调用必须是可见的。Functionsshallhaveprototypedeclarationsandtheprototypeshallbevisibleatboththefunctiondefinitionandcall.;8。2当声明或定义对象或函数的时候,必须明确规定它的类型。Wheneveranobjectorfunctionisdeclaredordefined,itstypeshallbeexplicitlystated;8。3
对于每个函数的参数来说,声明和定义中给出的类型必须全都,返回类型也必须全都。Foreachfunctionparameterthetypegiveninthedeclarationanddefinitionshallbeidentical,andthereturntypesshallalsobeidentical.;8。4
如果对象或函数被生命多次,类型必须是兼容的。Ifobjectsorfunctionsaredeclaredmorethanoncetheirtypesshallbecompatible.;8.5
在头文件中不能有对象或函数的声明。Thereshallbenodefinitionsofobjectsorfunctionsinaheaderfile;8.6
函数必须在文件范围内声明。Functionsshallalwaysbedeclaredatfilescope.;8.7
如果对象只在单个函数中被访问,那么它们必须在程序块中定义。Objectsshallbedefinedatblockscopeiftheyareonlyaccessedfromwithinasinglefunction;8。8
外部对象或外部函数只可以在一个文件中定义,并且只能在一个文件中定义。Anexternalobjectorfunctionshallbedeclaredinonefileandonlyonefile;8.9
有外部链接的标识符必须只有一个外部定义。Anidentifierwithexternallinkageshallhaveexactlyoneexternaldefinition.;8。10
全部文件范围的对象或函数声明都必须有内部链接,除非必需外部链接。Alldeclarationsanddefinitionsofobjectsorfunctionsatfilescopeshallhaveinternallinkageunlessexternallinkageisrequired;8.11
在有内部链接的对象和函数的定义和声明中必须使用静态存储类说明符.Thestaticstorageclassspecifiershallbeusedindefinitionsand
declarationsofobjectsandfunctionsthathaveinternallinkage;8.12
当声明一个有外部链接的数组时,必须通过初始化明确规定或隐式定义它的大小。Whenanarrayisdeclaredwithexternallinkage,itssizeshallbestatedexplicitlyordefinedimplicitlybyinitialisation;99。1全部自动变量在使用前必须配值.Allautomaticvariablesshallhavebeenassignedavaluebeforebeingused.;9。2在结构体与数组非零的初始化中,必须使用花括号来指示和匹配结构。Bracesshallbeusedtoindicateandmatchthestructureinthenon-zeroinitializationofarraysandstructures。;9.3在枚举表中,不行以用'=’结构来明确初始化除第一个成员以外的其他成员,除非全部条目都被明确初始化。Inanenumeratorlist,the’='constructshallnotbeusedtoexplicitlyinitialisemembersotherthanthefirst,unlessallitemsareexplicitlyinitialised。;
1010。1整数类型表达式的值不行以被隐式地转换为别的基本类型。Thevalueofanexpressionofintegertypeshallnotbeimplicitlyconvertedtoadifferentunderlyingtype;10。2
浮点类型表达式的值不行以被隐式地转换为别的类型。Thevalueofanexpressionoffloatingtypeshallnotbeimplicitlyconvertedtoadifferenttype;10.3
整数类型的简洁表达式的值只可能被转换为比它更有限的具有和表达式的基本类型相同符号的类型.Thevalueofacomplexexpressionofintegertypemayonlybecasttoatypethatisnarrowerandofthesamesignednessastheunderlyingtypeoftheexpression;10.4
浮点类型的简洁表达式的值只可以被转换为比其更有限的浮点类型.Thevalueofacomplexexpressionoffloattypemayonlybecasttonarrowerfloatingtype;10。5
如果位操作符'~’和’<<'应用于基本类型无符号字符型或无符号短整型的操作数,结果会立即转换成操作数的基本类型。Ifthebitwiseoperator~and<〈areappliedtoanoperandofunderlyingtypeunsignedcharorunsignedshort,theresultshallbeimmediatlycasttotheunderlyingtypeoftheoperand;10.6
无符号类型的全部常量都必须加上后缀'U'.The'U'suffixshallbeappliedtoallconstantsofunsignedtypes;
1111.1指向函数的指针不能转换成除整型以外的任何其他类型。Conversionshallnotbeperformedbetweenapointertoafunctionandanytypeotherthananintegraltype;11。2指向对象的指针不能转换成除整型、另一个指向对象的指针或指向void的指针以外的任何其他指针.Conversionshallnotbeperformedbetweenapointertoanobjectandanytypeotherthananintegraltype,anotherpointertoaobjecttypeorapointertovoid;11.3不行以进行指针类型和整数类型之间的类型转换。Acastshouldnotbeperformedbetweenapointertypeandanintegraltype;11.4不行以进行一对象指针和另一对象之间的类型转换。Acastshouldnotbeperformedbetweenapointertoobjecttypeandadifferentpointertoobjecttype;
11。5不行以进行从通过指针访问的类型中移除任何不变或可变限定条件的转换。Acastshallnotbeperformedthatremovesanyconstorvolatilequalificationfromthetypeaddressedbyapointer;1212.1
在表达式中,C操作符的优先规章应该设置限制相关性。LimiteddependenceshouldbeplacedonC'soperatorprecedencerulesinexpressions。;12。2
在标准允许的任何赋值挨次下表达式的值都必须相等。Thevalueofanexpressionshallbethesameunderanyorderofevaluationthatthestandardpermits.;12.3
含有副作用的表达式中应该不使用sizeof操作符。Thesizeofoperatorshouldnotbeusedonexpressionsthatcontainsideeffects.;12.4
规律'&&’或规律'||'操作符的右操作数不能含有副作用.Therighthandoperandofalogical&&or||operatorshallnotcontainsideeffects。;
12.5
规律‘&&’或‘||'的操作数必须是基本表达式。Theoperandsofalogical&&or||shallbeprimary-expressions.;12。6
规律操作符(&&,||和!)的操作数应该是有效的布尔变量。有效的布尔表达式不行以被作为除了(&&,||和!)以外的其他操作符的操作数来使用。Theoperandsofalogicaloperators(&&,||and!)shouldbeeffectivelyBoolean.ExpressionsthatareeffectivelyBooleanshouldnotbeusedasoperandstooperatorsotherthan
(&&,||and!).;12.7
位操作符不能应用于基本类型是有符号类型的操作数。Bitwiseoperatorsshallnotbeappliedtooperandswhoseunderlyingtypeissigned;12。8
位移操作符的右操作数必须间于零和一个比左操作数的基本类型的位宽更小的数之间。Therighthandoperandofashiftoperatorshallliebetweenzeroandonelessthanthewidthinbitsoftheunderlyingtypeofthelefthandoperand。;12.9
一元减法操作符不行以被应用于基本类型为无符号型的表达式.Theunaryminusoperatorshallnotbeappliedtoanexpressionwhoseunderlyingtypeisunsigned.;12.10
不行以使用逗号操作符。Thecommaoperatorshallnotbeused。;
12。11无符号整型常量表达式的赋值不应该导致回转。Evaluationofconstantunegerexpressionsshouldnotleadtowrap-around.;12。12
不行以用浮点值的基本比特表示法。Theunderlyingbitrepresentationsoffloating—pointvaluesshallnotbeused.;12.13在表达式中递增(++)和递减(--)操作符不能与其他操作符混合使用。Theincrement(++)anddecrement(—-)operatorsshouldnotbemixedwithotheroperatorsinanexpression;
1313.1在产生布尔值的表达式中不能使用赋值操作符。AssignmentoperatorsshallnotbeusedinexpressionsthatyieldaBooleanvalue.;13.2除非操作数是有效布尔变量,否则应该明确测试这个值为非零值。Testsofavalueagainstzeroshouldbemadeexplicit,unlesstheoperandiseffectivelyBoolean;13。3浮点表达式不能用相等或不相等来测试.Floating-pointexpressionsshallnotbetestedforequalityorinequality.;13.4一个‘for’语句的掌握表达式不行以包含浮点类型的对象。Thecontrollingexpressionofaforstatementshallnotcontainanyobjectsoffloatingtype;13.5’for'语句的三个表达式只能用于循环掌握。Thethreeexpressionsofaforstatementshallbeconcernedonlywithloopcontrol;13。6用于迭代计数的for循环内使用的数值变量不应该在循环体内修改。Numericvariablesbeingusedwithinaforloopforiterationcountingshouldnotbemodifiedinthebodyoftheloop.;13。7不允许结果不变的布尔操作。Booleanoperationswhoseresultsareinvariantshallnotbepermitted";
1414.1不行以存在不能到达的代码。Thereshallbenounreachablecode.;14。2全部的非空语句,要么不管如何执行都会至少产生一个副作用或者导致掌握流的转变.Allnon—nullstatementsshalleitherhaveatleastonesideeffecthoweverexecutedorcausecontrolflowtochange;14。3在预处理之前,空语句只能自己单独消灭在一行;假如跟在空语句后面的第一个字符是空格符的话后面可以跟一个注释。Beforepreprocessing,anullstatementshallonlyoccuronalinebyitself;itmaybefollowedbyacommentprovidedthatthefirstcharacterfollowingthenullstatementiswhite-spacecharacter;14。4不行使用‘goto’语句。Thegotostatementshallnotbeused.;14.5不行使用‘continue’语句。Thecontinuestatementshallnotbeused.;14.6任何迭代语句最多只能有一个break语句用来终止循环。Foranyiterationstatementthereshallbeatmostonebreakstatementusedforlooptermination;14.7函数中在函数的结尾必须有一个单独的退出点。Afunctionshallhaveasinglepointofexitattheendofthefunction;14。8构成'switch’,’while’,’do。..while’或’for'语句的主体的语句必须是复合语句。Thestatementformingthebodyofaswitch,while,do.。。whileorforstatementshallbeacompoundstatement;14.9'if'表达式结构后面必须跟一个复合语句。'else’关键字后面必须跟一个复合语句或跟另一个'if’语句。Anif(expression)constructshallbefollowedbyacompoundstatement.Theelsekeywordshallbefollowedbyeitheracompoundstatement,oranotherifstatement;14。10全部的'if..。elseif'结构都应该包含一个最终的’else'子句。Allif...elseifconstructsshouldcontainafinalelseclause。;
1515。0‘switch’语句必须遵守MISRA-C的语法。AswitchstatementshallconformtoMISRA-Csyntax;15.1当最内围的复合语句是‘switch'语句的正文时才可以使用‘switch’标记。Aswitchlabelshallonlybeusedwhenthemostclosely-enclosingcompoundstatementisthebodyofaswitchstatement;15。2无条件的‘break’语句将会终止全部非空的‘switch’子句。Anunconditionalbreakstatementshallterminateeverynon—emptyswitchclause;15.3‘switch'语句的最后子句必须是‘default’子句。Thefinalclauseofaswitchstatementshallbethedefaultclause;15。4
'switch'表达式不应该表示有效布尔变量的值。AswitchexpressionshouldnotrepresentavaluethatiseffectivelyBoolean;15.5全部‘switch’的语句必须至少有一个‘case'子句。Everyswitchstatementshallhaveatleastonecaseclause;1616.1函数不行以使用类型和数量不确定的参数来定义。Functionsshallnotbedefinedwithvariablenumbersofarguments.;
16。2函数不行以直接或间接地调用自己。Functionsshallnotcallthemselves,eitherdirectlyorindirectly.;16.3函数的原型声明中全部参数必须有标识符。Identifiersshallbegivenforalloftheparametersinafunctionprototypedeclaration.;16。4函数声明与函数定义中的标识符必须全都。Theidentifiersusedinthedeclarationanddefinitionofafunctionshallbeidentical.;16.5无参数的函数必须使用’void'参数类型声明.Functionswithnoparametersshallbedeclaredwithparametertypevoid.;
16。6传递给函数的参数个数必须跟声明参数个数全都。Thenumberofargumentspassedtoafunctionshallmatchthenumberofparameters.;
16.7如果函数原型中的指针参数不被用于转变寻址对象,此指针应被声明为指向常量的指针。Apointerparameterinafunctionprototypeshouldbedeclaredaspointertoconstifthepointerisnotusedtomodifytheaddressedobject.;16.8返回类型非void的函数的全部推出路径都必须有明确的带有表达式的return语句。Allexitpathsfromafunctionwithnon—voidreturntypeshallhaveanexplicitreturnstatementwithanexpression.;16。9使用函数标识符时必须前面带'&’或者带有一个用’()'括起来的参数表,其中参数表可以为空.Afunctionidentifiershallonlybeusedwitheitherapreceding&,orwithaparenthesisedparameterlist,whichmaybeempty.;16.10如果一个函数返回错误的信息,应该测试这个错误的信息。Ifafunctionreturnserrorinformation,thenthaterrorinformationshouldbetested。;1717.1指针运算只能应用于指示数组或数组变量地址的指针之间。Pointerarithmeticshallonlybeappliedtopointersthataddressanarrayorarrayelement。;17.2指针的减法只能应用于指示同一个数组的元素地址的指针之间。Pointersubtractionshallonlybeappliedtopointersthataddresselementsofthesamearray.;17.3不行使用‘〉’,‘>=',‘〈’或‘〈=’于指针类型,除非其是指同一数组的指针。>,>=,〈,<=shallnotbeappliedtopointertypesexceptwheretheypointtothesamearray.;
17.4只有数组下标的形式允许使用指针运算。Arrayindexingshallbetheonlyallowedformofpointerarithmetic.;17。5对象声明所包含的间接指针不应该超过2层.Thedeclarationofobjectsshouldcontainnomorethan2levelsofpointerindirection.;
17.6自动存储的对象的地址不能赋给对象终止以后还可能连续存在的对象。Theaddressofanobjectwithautomaticstorageshallnotbeassignedtoanobjectthatmaypersistaftertheobjecthasceasedtoexist。;1818.1全部结构体与联合体类型必须在翻译单位完成。Allstructureoruniontypesshallbecompleteattheendofatranslationunit。;18。2不行以把对象支配给重叠对象。Anobjectshallnotbeassignedtoanoverlappingobject.;18.3为了无关的目的不能重用内存空间。Anareaofmemoryshallnotbereusedforunrelatedpurposes.;
18.4不行使用联合体。Unionsshallnotbeused;1919.1文件中,在#include语句之前只可使用其他的预处理指令或注释。#includestatementsinafileshallonlybeprecededbyotherpre-processordirectivesorcomments.;19。2在#include指令的头文件名中不应该消灭非标准字符。Non—standardcharactersshouldnotoccurinheaderfilenamesin#includedirectives.;
19.3#include指令之后必须有〈filename>或\"filename\"的序列。The#includedirectiveshallbefollowedbyeithera<filename>or\"filename\”sequence。;19.4C语言的宏只可以扩展为使用花括号的一个初始化表达式、一个常量、一个使用圆括号的表达式、一个类型的限定词、一个存储类的说明符或者一个‘do-while-zero’的结构。Cmacrosshallonlyexpandtoabracedinitialiser,aconstant,aparenthesisedexpression,atypequalifier,astorageclassspecifier,orado-while-zeroconstruct。;19.5宏不行以在一个块中被#define和#undef.Macrosshallnotbe#define’dand#undef'dwithinablock。;
19.6不行使用#undef.#undefshallnotbeused.;19.7与宏相比应该优先使用函数.Afunctionshouldbeusedinpreferencetoamacro.;19.8使用类似函数的宏时必须调用其全部的参数。Afunction-likemacroshallnotbeinvokedwithoutallofitsarguments;19。9类似函数宏的参数不行以包含类似预处理指令的标记。Argumentstoafunction-likemacroshallnotcontaintokensthatlooklikepre-processingdirectives.;19.10类似函数宏的定义中每个参数的实例必须放在圆括号中,除非其是‘#’或‘##’的操作数.Inthedefinitionofafunction—likemacroeachinstanceofaparametershallbeenclosedinparenthesesunlessitisusedastheoperandof#or##。;19.11预处理指定中的全部宏标识符都必须在使用前定义,除非在#ifdef和#ifndef预处理指令和define()操作符中。Allmacroidentifiersinpreprocess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服装行业面料设计师培训心得
- 急诊抢救科护士的工作总结
- 造纸行业工程师工作总结
- 农业行业销售工作总结
- 纺织服装行业营业员工作总结
- 科研行业前台工作总结
- 服装行业人才招聘实例总结
- 艺术行业行政后勤工作总结
- 《管教儿女的智慧》课件
- 《心力衰竭护理》课件
- 维修工作流程图
- Y2-90S-4-三相异步电动机的制作-课程设计报告
- 中式烹调工艺与实训(第三版) 课件 第10、11章 烹饪美学、菜肴创新
- 物业投诉处理培训课件
- 《春秋》导读学习通章节答案期末考试题库2023年
- 1.1、供应商管理控制流程与风险控制流程图
- 初二年级劳动课教案6篇
- 箱变迁移工程施工方案
- 北师大版九年级数学下册《圆的对称性》评课稿
- 《遥感原理与应用》期末考试试卷附答案
- 物流无人机垂直起降场选址与建设规范(征求意见稿)
评论
0/150
提交评论