原创 嵌入式软件安全性以及MISRAC

2011-6-7 09:46 1737 2 2 分类: MCU/ 嵌入式
    C语言是开发嵌入式应用的主要工具,然而 C语言并非是专门为嵌入式系统
设计,相当多的嵌入式系统较一般计算机系统而言对软件安全性(可靠性)有更
苛刻的要求,所以因此会带来更多的安全隐患。 
 
    丰田汽车已经表示要对 2005 年 10、2003 年 8 月至 2004 年 11 月生产的约
16 万辆混合动力汽车“普锐斯”进行无偿修理。据称,主要是发动机的ECU 程
序出了问题,行驶中发动机会突然停止。此外宝马公司 2003 年 7 月也因发动机
ECU的软件问题而提出召回缺陷汽车。 1999年7月22 日,通用汽车公司(General 
Motors)也因为其软件设计上的一个问题,被迫召回 350 万辆已经出厂的汽车。
同样,在电梯和医疗器械产品上也出现过类似的严重问题。

     由此可以看出软件质量问题已经越来越深刻的影响到了产品的质量,甚至有
些时候是致命的,在航空航天等领域更是如此。然而,很少有程序员知道什么样
的程序是安全的程序。很多程序只是表面上可以干活,还存在着大量的隐患。当
然,这其中也有 C语言自身的原因。因为 C语言是一门‘入门容易,得道难’
的语言,其灵活的编程方式和语法规则对于一个新手来说很可能会成为机关重重
的陷阱。同时,C语言的定义还并不完全,即使是国际通用的 C语言标准,也
还存在着很多未完全定义的地方。要求所有的嵌入式程序员都成为 C语言专家,
避开所有可能带来危险的编程方式,是不现实的。最好的方法是有一  个针对安
全性的 C语言编程规范,告诉程序员该如何做。MISRA C 因此应运而生。 
  
    1994 年,在英国成立了一个叫做汽车工业软件可靠性联合会(The Motor 
Industry Software Reliability Association,简称MISRA)的组织。它是致力于协助
汽车厂商开发安全可靠的软件的跨国协会,其成员包括:AB汽车电子、罗孚汽
车、宾利 汽车、福特汽车、捷豹汽车、路虎公司、 Lotus 公司、 MIRA公司、 Ricardo
公司、TRW汽车电子、利兹大学和福特 VISTEON汽车系统公司。 
  经过了四年的研究和准备, MISRA于 1998年发布了一个针对汽车工业软件
安全性的C语言编程规范—— 《汽车专用软件的C语言编程指南》  (Guidelines for 
the Use of the C Language in Vehicle Based Software),共有 127 条规则,称为
MISRA C:1998。目前 MISRA C:2004 版已有 141 条规则,21 个类别,每一条规
则对应一条编程准则。 

    “安全第一”的 C语言编程规范 

    C/C++语言无疑是当今嵌入式开发中最为常见的语言。早期的嵌入式程序大都是用汇编语
言开发的,但人们很快就意识到汇编语言所带来的问题——  难移植、难复用、难维护和可
读性极差。很多程序会因为当初开发人员的离开而必须重新编写,许多程序员甚至连他们自
己几个月前写成的代码都看不懂。C/C+ +语言恰恰可以解决这些问题。作为一种相对“低级”
的高级语言,C/C++语言能够让嵌入式程序员更自由地控制底层硬件,同时享受高级语言带
来的便利。对  于 C 语言和 C++语言,很多的程序员会选择 C 语言,而避开庞大复杂的 C++
语言。这是很容易理解的——C 语言写成的代码量比 C++语言的更小些,执行效率  也更高。  
  对于程序员来说,能工作的代码并不等于“好”的代码。“好”代码的指标很多,包括易读、
易维护、易移植和可靠等。其中,可靠性对嵌入式系统非常  重要,尤其是在那些对安全性
要求很高的系统中,如飞行器、汽车和工业控制中。这些系统的特点是:只要工作稍有偏差,
就有可能造成重大损失或者人员伤亡。一  个不容易出错的系统,除了要有很好的硬件设计
(如电磁兼容性),还要有很健壮或者说“安全”的程序。 
  然而,很少有程序员知道什么样的程序是安全的程序。很多程序只是表面上可以干活,
还存在着大量的隐患。当然,这其中也有 C 语言自身的原因。因为 C语言是一门难以掌握
的语言,其灵活的编程方式和语法规则对于一个新手来说很可能会成为机关重重的陷阱。同
时,C 语言的定义还并不完全,即使是国际通用的 C 语言标准,也还存在着很多未完全定
义的地方。要求所有的嵌入式程序员都成为 C语言专家,避开所有可能带来危险的编程方
式,是不现实的。最好的方法是有一  个针对安全性的 C 语言编程规范,告诉程序员该如何
做。

     MISRAC 2004的规则总共有21类141条规则,具体内容各位可在网上搜索MISRAC的手册,其
中几条严禁使用的规则怕是大家平时都在用,比如禁用stdio函数,这样就不能使用printf了,
还有禁用联合体,禁用atoi函数,禁用动态分配内存等等。

    
     
     
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条