专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »嵌入式开发 » 嵌入式应用:C++编程语言在嵌入式应用中的安全问题 »正文

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

来源: 发布时间:星期二, 2009年12月8日 浏览:0次 评论:0
 作者:林轶邵贝贝   

在嵌入式系统软件Software设计中“汇编语言+C语言”早已成为理所当然经典组合对于硬件配置来说汇编语言清晰明了;对于上层设计来说C语言紧凑高效这样搭配能够满足大多数传统嵌入式系统应用需要随着技术水平提高今天嵌入式系统也比过去更加深入到人们日常生活中大到汽车、飞机、火箭小到手机、打印机、闹钟、手表都可以找到嵌入式系统踪影然而这看似成不变情况也在悄然转变随着网络、多媒体等技术出现、发展和普及对嵌入式系统应用有了新要求也给了其他高级语言特别是C语言以机会

由此带来在语言使用中安全问题目前虽然还未凸显但根据以往经验来看终将成为限制行业发展新瓶颈已有C语言国际标准虽然庞大细致但作为个“语言标准”只能是尽力做得面面俱到其目标在于构造个语句合法性权威依据以约束人们对于C使用但它并不是针对应用而写规范标准对于可能遇到安全性问题也无法进行特别深入探讨更加没有安全方面实战经验支撑个针对安全方面、被国际所认可使用规范标准无疑是C语言在嵌入式系统中得到广泛应用坚实基础和助推剂

1 C在嵌入式应用中机遇和挑战

C作为门高级语言人们在提及它时总难免会谈到C语言直至今天很多人对于C语言认识依然是“C语言超集”这是C起源和C语言有着千丝万缕联系

1978年美国贝尔实验室Dennis Ritchie和BrianKernighan在BCPL以及其简化版本B语言基础的上开发了C语言并合作出版了The C Programming Lan-guageC语言迅速得到了大家认可并广为流传1989年ANSI推出了第个C语言标准——X3.159-1989并被ISO采纳随的发布ISO/IEC 9899-1990早在C语言标准发布的前贝尔实验室Bjarne Stroustrup就致力于在C语言里增加类、类型检查以及其他些优秀特征于1980年发布“C with Classes”经过持续努力他最终完成了对C语言改造由此创生出门新语言——C并出版了The C ProgrammingLanguage由于它带来了持续影响ISO于1998年发布ISO/IEC 14882:1998;几乎同时间ANSI也发布了类似标准这标志着C作为门独立语言标准化得到了官方认可

统计数据表明日常生活中个美国人平均占用8个微控制器这些都离不开嵌入式系统应用然而嵌入式系统软件Software技术似乎落后于当前软件Software发展形势近年来才逐渐由汇编语言过渡到面向过程C语言但对于面向对象语言应用还很有限

方面是由于嵌入式开发人员多年来应付有限资源经验而养成保守态度方面也是由于长久以来嵌入式系统应用设计中人们要花费许多精力在底层硬件驱动上功能实现也主要局限在实时操作系统和相关支撑软件Software层次并不涉及过多应用软件Software开发这种在严苛条件下追求效率和实时性任务其他高级语言并没有特别优势

最近几年嵌入式系统领域又有了新发展首先随着手机、PDA等消费性电子产品飞速增长嵌入式系统市场规模在迅速扩大同时越来越多智能嵌入式应用场合需要互联网支持这要求嵌入式系统软件Software具有更好应用性和更高复杂性;其次随着芯片等相关领域技术进步嵌入式系统工程师们不再需要时时刻刻去考虑资源是否够用了当面向对象高级语言参和到嵌入式系统设计中去不再遥不可及时语言效率则成为突出问题根据Thinking in C整理总结C和C效率差别往往在±5%这使得C在新嵌入式应用发展浪潮中占得先机

值得注意尽管自1998年发布最初C标准——ISO/IEC 14882:1998以来每5年都会对此标准进行次更新但是由于C语言过于复杂以及它经历了长年演变直到2004年没有任何款编译器完全支持ISO C这对于时常要面对各种严苛条件嵌入式系统应用工程师们来说是难以忍受同时即使是符合ISO C标准语句或者格式对于实际应用场合来说也存在着重大隐患而不应当被直接采用因此人们迫切需要个正式基于安全角度考虑C语言使用规范标准

2 有关MISRA

MISRA(the Motor Industry Software Reliability As-sociation)即汽车工业软件Software可靠性协会于1994.年在英国成立以“协助汽车工业提供安全、可靠软件Software”为使命期望通过“规范标准指南”形式来约束人们在汽车电子以及其他嵌入式系统开发领域或涉及安全和可靠性领域中对于语言使用由于这些“规范标准指南”都是从大量工程实战中整理总结手经验因而具有极高指导意义

经过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组织不仅是汽车工业软件Software规范标准权威其制定规范标准指南更得到了嵌入式系统应用领域广泛认可考虑到近年来C语言在嵌入式系统中应用越来越多2005年MISRA C委员会成立并于2008年推出针对C语言MISRA C:2008——Guidelines for the USe of the C language in critical sys-tems>>以下简称“MISRA C:2008”有兴趣读者可以联系相关网站WebSite:http://www.misra-cpp.com/购买详细文档

MISRA C:2008同样从推出的日起就得到了业内外广泛关注例如:LDRA软件Software公司直跟踪着MIS-RA C:2008制定进展在MISRA C:2008发布时同步宣称已经完成了对工具套件产品相应改进使其符合MISRA C:2008标准(LDRATestbed产品曾成功用于“神舟”飞船项目软件Software测试)

3 MISRA C概述

作为规范标准指南MISRA C:2008基于ISO/IEC 14882:2003C语言国际标准以规则(rule)形式给出了相关建议规则又细分为以下3种类型:

①强制型(required)必须符合、允许例外;
②推荐型(advisory)推荐符合;
③不容讨论型(document)必须符合、不许例外

MISRA C:2008中共给出了20个大类规则(编号并不连续)细分为228条详细情况如表1所列



文档中所有规则书写格式如下:


每条规则的后都有详细解释并给出了些具体语句作为例子下面分别针对上述3种规则类别进行举例介绍说明

规则0-1-1(强制)工程中不允许包含无法触及代码


上述例子里条件判断中赋值语句和语句的后自增语句都是在任何条件下都无法触及死代码不允许这样使用 

规则0-1-2 (强制) 工程中不允许含有永远不会被执行路径

enum ec{REDBLUEGREEN)col;
(col<=GREEN) //不符合规则条件永远为真
{
//Will always gethere
}

{
//代码永远不会到达这里
}

由于枚举类型有默认赋值012故col永远≤GREEN上述例子中含有任何条件下都不会被执行路径不允许这样使用

规则5-2-10(推荐) 自增()/自减(--)运算符不应和表达式中其他运算符混合使用诸如下面例程将导致理解上混淆以及结果不确定设计时应尽可能避免

u8a=u8b+u8c-; //不符合规则

规则0-4-2 (不容讨论) 对于浮点运算(floating-po)算法使用必须给出记录
安全使用浮点算法需要具有较高数字分析技能和对编译器及硬件对象深入了解因此在使用浮点算法时必须先进行分析:是否必须使用它、采取思路方法是否可行、过程是否得到了正确执行并将上述结果做出记录

规则16-6-1 (不容讨论) 所有代码必须符合MISRA C

上述这些例子只是为了让大家对MISRA C:20083种规则有认识我们会结合相关内容在接下来几篇文章中进步讨论学习不难发现许多违反了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种可能安全问题来源:开发人员、开发人员对于语言误解、编译器没有按照开发人员预期工作、编译器本身含有、运行

这些来源和实际使用是何种计算机语言没有关系可以说比较全面地包含了嵌入式系统开发以及其他相关软件Software设计中可能导致安全问题所有渠道

作为C这样门面向对象高级语言(由于其和C渊源严格地说C是具有某些面向对象特征过程语言)通过类、参数类型检查、模版、异常处理以及派生、继承、多态等手段使得其在保有高效率同时实现了强大功能并带来了自顶向下模块化设计理念但编程灵活度提高也令其代码复杂而易错和C语言相比它所面对安全问题将更为隐蔽更加难以发现但就对数据封装而言C远远优于C只要参照合理规范标准指南进行项目开发就可以通过充分发挥C灵活特点应用到更多更广工程领域

5 行业展望

标准和规范标准从来没有如眼下这般备受重视过个权威标准或规范标准不仅将成为相关领域“金科玉律”更是行业动向风向标可以说正是由于MISRA-C存在使得在高级语言种类繁多今天C语言地位依然无可替代

此次MISRA携着在C语言上巨大成功选择了C语言进行新规范标准化尝试不仅C语言群众基础深厚更是表明了嵌入式系统领域内大多数专家观点:如果说未来能有门语言取代目前C语言在嵌入式系统应用中地位也只能是C语言名成功嵌入式系统工程师必须是对行业动向极为敏感也只有这样才能在知识爆炸今天紧跟时代潮流从使用C语言到使用C语言是个巨大跨越决不仅仅像使用“增强C”那么简单需要从现在就开始学习而从学习的初就养成良好语言使用习惯将决定将来进阶速度和可能性MISRA C:2008无疑是培养这样良好习惯最佳手册

标签:嵌入式应用
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: