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

发布者:TechVoyager最新更新时间:2009-10-28 来源: 单片机与嵌入式系统关键字:嵌入式系统  C++  MISRA 手机看文章 扫描二维码
随时随地手机看文章

  在嵌入式系统的软件设计中,“汇编语言+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-guage》。C语言迅速得到了大家的认可,并广为流传。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个微控制器,这些都离不开嵌入式系统的应用。然而嵌入式系统软件技术似乎落后于当前的软件发展形势,近年来才逐渐由汇编语言过渡到面向过程的C语言。但对于面向对象语言的应用还很有限。

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

  最近几年,嵌入式系统领域又有了新的发展。首先,随着手机、PDA等消费性电子产品的飞速增长,嵌入式系统的市场规模在迅速扩大,同时越来越多的智能嵌入式应用场合需要互联网的支持,这要求嵌入式系统的软件具有更好的应用性和更高的复杂性;其次,随着芯片等相关领域的技术进步,嵌入式系统工程师们不再需要时时刻刻去考虑资源是否够用了。当面向对象的高级语言参与到嵌入式系统设计中去不再遥不可及时,语言的效率则成为突出的问题。根据《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),即汽车工业软件可靠性协会,于1994.年在英国成立,以“协助汽车工业提供安全、可靠的软件”为使命,期望通过“规范指南”的形式来约束人们在汽车电子以及其他嵌入式系统开发领域或涉及安全与可靠性的领域中对于程序语言的使用。由于这些“规范指南”都是从大量工程实践中总结的第一手经验,因而具有极高的指导意义。

  经过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规范又对源码作了相应的修改,并发布了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无疑是培养这样良好习惯的最佳手册。

关键字:嵌入式系统  C++  MISRA 引用地址:C++编程语言在嵌入式应用中的安全问题

上一篇:爱特梅尔新款评测工具包加速嵌入式微处理器开发
下一篇:Silicon Labs:看好人机界面,推出完整方案

推荐阅读最新更新时间:2024-05-02 20:54

爱特梅尔推IEEE P802.15.4c兼容RF收发器
爱特梅尔公司宣布推出面向中国无线市场的IEEE P802.15.4c兼容RF收发器AT86RF212,这款完全集成的收发器提供了非常灵活的频带和数据率组合,客户可以选择工作于779 到787 MHz的中国WPAN 频带;或863到870 MHz的欧洲SRD频带,以及902到928 MHz 的北美ISM频带。直接序列展频 (direct sequence spread spectrum) 技术支持不同的调制技术和数据率:包括数据率为20和40 kbit/s的BPSK (符合IEEE 802.15.4-2006);数据率为100和250 kbit/s 的O-QPSK (符合IEEE 802.15.4-2006);数据率为250
[测试测量]
S3C2410的UART控制(RS232)
一、UART简介 UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,工作于数据链路层。包含了RS-232、RS-422、RS-485串口通信和红外(IrDA) 等等。UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。UART基本可分为并口通信及串口通信两种。 异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。图给出了其工作模式: 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通
[单片机]
S3<font color='red'>C</font>2410的UART控制(RS232)
基于C8051F041的电力变压器非电量保护装置
1 引言 电力变压器是电力系统中应用相当普遍而又十分重要的电气设备,它运行较为可靠,故障机率小。但是在运行中,还是可能发生箱内故障、箱外故障及出现不正常工作状态。其中,箱内故障是非常危险的,因为短路电流产生的电弧不仅会破坏绕组绝缘,烧坏铁芯,还可能使绝缘材料和变压器油受热而产生大量气体,引起变压器油箱爆炸。一旦发生故障,将给电力系统的运行带来严重的后果。 为了保证变压器的安全运行和防止扩大事故,根据变压器的容量大小及其重要程度安装灵敏、快速、可靠和选择性好的各种专用保护装置是极为重要的。 对变压器的保护主要分为电量型继电保护和非电量型保护。 电力变压器的电量型继电保护主要有:差动保护、电流速断保护、零序电流保护等,但这些保护
[单片机]
基于<font color='red'>C</font>8051F041的电力变压器非电量保护装置
“iPhone XI”新爆料:千万前置相机USB-C悬了
不久前,知名爆料人员Onleaks曝光了最新的苹果“iPhone XI”渲染图,摄像头设计与之前完全不同,甚至还用上了环形闪光灯,现在他又公布了更多的爆料,包括前置1000万像素以及后置相机的部分规格。 ▲图自compareraja   今天,CompareRaja(通过OnLeaks)透露了更多关于“iPhone XI”规格的细节。他们爆料称2019款 iPhone 将采用新的10MP自拍相机,后置摄像头则会包括一个14MP和一个10MP摄像头,但CompareRaja指出,第三个传感器仍然未知。据悉,目前iPhone XS配备两个12MP传感器。外媒预测2019款iPhone三相机模组将会配备双14MP摄像头,
[手机便携]
“iPhone XI”新爆料:千万前置相机USB-<font color='red'>C</font>悬了
为何说电流分配对于整个嵌入式系统至关重要
的参考转换效率为80%。工程师可根据电源电流计算表的典型值进行电源系统的设计,并以最大值来进行校验。 再者,在设计电源系统时还得考虑模块的同步系数,即在同一时间内,参与消耗电流的器件的比例,一般为0.5~0.7,选取值根据实际的系统来决定。为保证电源系统的稳定性,我们可选取同步系数0.5,即同一时间内,系统中半数耗电模块的电流值取最大值,其它的取额定值来计算器功耗。 二、绘制电源树图 根据估计的电流,以及各电压等级电流的分配,绘制更加形象直观的树状图。 1、基本格式要求: 不同电压等级使用的线条颜色,若电压等级不在示例内,可以自定义线条颜色; 电源IC块中:第一行,电源芯片型号;第二行,输出电压,电流值;第三行
[电源管理]
极智嘉完成2亿美元C轮融资!
6月17日消息,极智嘉(Geek+)在2019年6月完成C1轮后又完成了C2轮融资,融资总额超过2亿美元。C2轮由云晖资本领投、鸿为资本和祥峰成长基金跟投。 智能机器人公司极智嘉(Geek+)成立于2015年,公司应用先进的机器人和人工智能技术,打造高效、柔性、可靠的解决方案,帮助全球各行业的企业提升物流效率,实现智能化升级。 据了解,极智嘉目前已在全球20 多个国家和地区拥有全球化销售、运营和服务能力,服务耐克、沃尔玛、迪卡侬、丰田、DHL等近300家世界知名品牌,包括近40家世界500强企业,实现了大规模商业落地。全球市场研究机构Interact Analysis报告显示,极智嘉的全球自主移动机器人市场份额位列世界第一。此外,
[机器人]
小米MIX5 Pro解密:自研澎湃C2 ISP加持
不同于小米11,小米12系列首发仅有两款,看起来这一代数字系列的产品策略发生了比较大的变化,所以,所谓“小米12 Ultra”被小米MIX5 Pro取代的爆料似乎并非“危言耸听”。   日前,有博客晒出所谓小米MIX 5 Pro的相关代码信息,内容显示,摄像头部分出现了“MIPISEL”字段,此前只在MIX Fold上见过,猜测对应的是小米自研澎湃ISP。   由于是换代产品,合理的答案可能是澎湃C2芯片。 专利机构绘制的小米MIX5 Pro渲染,仅供参考   关于小米MIX5 Pro的相机参数,传言是5000万像素光学防抖主摄(IMX707)、4800万像素5倍光变镜头以及5000万像素超广角,构型或是圆形模组。  
[手机便携]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved