首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++编程语言在嵌入式应用中的安全问题(2)

C++编程语言在嵌入式应用中的安全问题(2)

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规范又对源码作了相应的修改,并发布了2.62的新版本,宣称其源代码99%符合MISRA C:1998的要求。
4 安全性问题
对于安全性,MISRA给出以下5种可能的安全问题来源:开发人员的错误、开发人员对于语言的误解、编译器没有按照开发人员的预期工作、编译器本身含有错误、运行错误。
这些错误的来源与实际使用的是何种计算机语言没有关系,可以说比较全面地包含了嵌入式系统开发以及其他相关的软件设计中可能导致安全问题的所有渠道。
作为C++这样一门面向对象的高级语言(由于其与C的渊源,严格地说,C++是具有某些面向对象特征的过程语言),通过类、函数参数类型检查、模版、异常处理以及派生、继承、多态等手段,使得其在保有高效率的同时,实现了强大的功能,并带来了自顶向下的模块化程序设计理念。但编程灵活度的提高,也令其代码复杂而易错。与C语言相比,它所面对的安全问题将更为隐蔽,更加难以发现。但就对数据的封装而言,C++远远优于C,只要参照合理的规范指南,进行项目的开发,就可以通过充分发挥C++灵活的特点,应用到更多更广的工程领域。
5 行业展望
标准与规范从来没有如眼下这般备受重视过。一个权威的标准或规范,不仅将成为相关领域的“金科玉律”,更是行业动向的风向标。可以说正是由于MISRA-C的存在,使得在高级语言种类繁多的今天,C语言的地位依然无可替代。
此次MISRA携着在C语言上的巨大成功,选择了C++语言进行新的规范化尝试,不仅因为C++语言的群众基础深厚,更是表明了嵌入式系统领域内大多数专家的观点:如果说未来能有一门语言取代目前C语言在嵌入式系统应用中的地位的话,也只能是C++语言。一名成功的嵌入式系统工程师,必须是对行业动向极为敏感的,也只有这样,才能在知识爆炸的今天紧跟时代潮流。从使用C语言到使用C++语言是一个巨大的跨越,决不仅仅像使用“增强的C”那么简单,需要从现在就开始学习。而从学习之初就养成的良好的语言使用习惯,将决定将来进阶的速度与可能性。MISRA C++:2008无疑是培养这样良好习惯的最佳手册。
返回列表