C++在嵌入式应用中的安全问题
范指南”的形式来约束人们在汽车电子以及其他嵌入式系统开发领域或涉及安全与可靠性的领域中对于程序语言的使用。由于这些“规范指南”都是从大量工程实践中总结的第一手经验,因而具有极高的指导意义。 经过4年准备,它在1998年发布了一个针对汽车工业的《Guidelines for the Use of the C Langtlage in VehicleBased Software》,简称“MISRA C:1998'’,针对那些满足C语言标准,却存在安全隐患的语言使用习惯,提出了127条规则。由于它很好地解决了C语言国际标准的冗繁性,以及其中对于安全性考虑的不足性,从而得到了广泛的好评。MISRA-C不仅成为众多汽车厂商推崇的行业标准,其影响力更是远远超出了汽车工业,得到铁路、航空航天、国防、医疗等众多领域的认可,成为“最佳实践”解决方案。2004年,MISRA对于已有的规则进行改编与扩充,推出了“MISRA C 2004”,首次将该规范指南的对象从汽车工业推广到所有具有安全性要求的系统应用中去,包含了强制规则121条,推荐规则20条,并删除了15条旧规则,共计含有141条规则。 时至今日,MISRA组织不仅是汽车工业软件规范的权威,其制定的规范指南更得到了嵌入式系统应用领域的广泛认可。考虑到近年来,C++语言在嵌入式系统中的应用越来越多,2005年MISRA C++委员会成立,并于2008年推出针对C++语言的《MISRA C++:2008——Guidelines for the USe of the C++ language in critical sys-tems>>,以下简称“MISRA C++:2008”。有兴趣的读者可以联系相关网站:http://www.misra-cpp.com/,购买详细的文档。 MISRA C++:2008同样从推出之日起,就得到了业内外广泛关注。例如:LDRA软件公司一直跟踪着MIS-RA C++:2008的制定进展,在MISRA C++:2008发布时同步宣称已经完成了对工具套件产品的相应改进,使其符合MISRA C++:2008标准。(LDRA的Testbed产品曾成功用于“神舟”飞船项目的软件测试) 3 MISRA C++概述 作为规范指南,MISRA C++:2008基于ISO/IEC 14882:2003的C++语言国际标准,以规则(rule)的形式,给出了相关的建议。它的规则又细分为以下3种类型: ①强制型(required),必须符合、允许例外; ②推荐型(advisory),推荐符合; ③不容讨论型(document),必须符合、不许例外。 MISRA C++:2008中共给出了20个大类的规则(编号并不连续),细分为228条。详细情况如表1所列。 文档中所有规则的书写格式如下: 每条规则之后都有详细的解释,并给出了一些具体的程序语句作为例子。下面分别针对上述3种规则类别,进行举例说明。 规则0-1-1(强制)工程中不允许包含无法触及的代码 上述例子里,条件判断中的赋值语句和return语句之后的自增语句都是在任何条件下都无法触及的死代码,不允许这样使用。 规则0-1-2 (强制) 工程中不允许含有永远不会被执行的路径 enum ec{RED,BLUE,GREEN)col; if(col=GREEN) //不符合规则,条件永远为真 { //Will always get,here } else { //代码永远不会到达这里 } 由于枚举类型有默认的初始赋值0,1,2,…,故col永远≤GREEN。上述例子中,含有任何条件下都不会被执行的路径,不允许这样使用。 规则5-2-10(推荐) 自增(++)/自减(--)运算符不应与表达式中其他运算符混合使用诸如下面的例程将导致理解上的混淆以及结果的不确定,在程序设计时应尽可能避免。 u8a=++u8b+u8c-; //不符合规则 规则0-4-2 (不容讨论) 对于浮点运算(floating-point)算法的使用,必须给出记录 安全的使用浮点算法需要具有较高的数字分析技能和对编译器及硬件对象的深入了解。因此在使用浮点算法时,必须先进行分析:是否必须使用它、采取的方法是否可行、过程是否得到了正确的执行,并将上述结果做出记录。 规则16-6-1 (不容讨论) 所有的库函数代码必须符合MISRA C++ 上述这些例子只是为了让大家对MISRA C++:2008的3种规则有一定的认识,我们会结合相关内容,在接下来的几篇文章中进一步讨论学习。不难发现,许多违反了MISRA C++:2008中规则的例程都是符合C++语言标准的,但出于安全性考虑,应当被禁止或者谨慎使用。通览之后,往往会发现自己平时从未注意的一些编程习惯,都已经被严令禁止。它们有些是明显有碍安全性的,有些则相对隐蔽。 然而MISRA的号召力是不容小觑的。以嵌入式实时操作系统μC/OS-II为例,其2.52版本虽然已经于2000年通过了美国航空管理局(FAA)的安全认证,但2003年μC/OS-II的作者就根据MISRA C:1998规
- 嵌入式系统的VxWorks安全性问题研究(11-06)
- DSP编程过程中的几个关键问题的研究(06-05)
- 教你构造一个51单片机的实时操作系统(08-22)
- DSP开发中值得注意的问题(02-16)
- 基于DSP编程的几个关键问题(03-26)
- 调试前的组网故障问题总结(12-19)