20世纪90年代初,汽车电子产品的重要性日益凸显。电子产品中的软件也随之变得举足轻重。不论是从商业角度还是从安全角度考虑,保证软件可靠性都是很有必要的。如今,一辆汽车内的软件代码可扩展到百万行的量级。保证软件的可靠性正面临着空前的挑战。
汽车工业软件可靠性协会(misra),是在英国政府的大力支持下,由多家汽车工业的公司代表组成,以应对汽车电子中日益增长的软件使用,并给嵌入式软件的发展提供指导。该协会针对软件工程中出现的问题不断发布新的标准。
该协会首先于1994年发布了“基于车辆的软件开发指南”。此指南为iec 61508标准(“电气/电子/可编程电子安全相关系统的功能安全”)中汽车行业标准的前身。而iso 26262标准(道路车辆功能安全)取代了此指南。协会建立至今,发表了一系列的文件和指南,用以解决c和c 语言的一些固有问题。
c 和 c
c和c 语言在嵌入式软件开发领域使用非常广泛(vd c研究显示:受访企业的嵌入式系统开发,70%在使用c语言,42%在使用c 语言)。c语言提供了一个广泛的资源库,众多工具都支持该语言,有着丰富的开发库。
c语言替代汇编语言发展成为应用程序语言,但从没有考虑过其是否适合用于安全关键环境。一个通过编译并完全符合iso语言标准要求的c程序,可能还会包含不可预测的行为——在如汽车制动系统等应用程序中,此种情况显然是不可接受的。我们可以通过限制语言的使用大幅减少危险的发生。这一直是misra编码准则的基本目的。
编码标准
编码标准即定义一种统一编码方式。不同于可靠性、可移植性和可维护性等影响软件质量的重要属性,虽然编码风格属于个人喜好,但是在一个软件项目中,统一的编码风格也是一项重要约束。编码标准更为基本的作用是定义一个更安全的编程语言的子集。通过制定一组规则,消除编码结构已知的危险。
c语言允许开发人员做很多本质上不正确的事情,所以编写符合语言标准要求的代码非常容易。但是这将导致程序失败(如崩溃)或者未定义的行为。如访问数组或算术运算内存范围之外导致溢出。
显然确定这样的“bugs”是非常重要的。其中一些可通过编译器识别出来,当然专门的静态分析工具将更为有效。然而,编码标准的主要目的并非识别问题而是着重预防,它们劝诫开发人员不要犯这样显而易见的“错误”。
编码规则的根本目的是限制语言的使用,用以避免开发人员做本质上是“错误”或者有潜在危险的事情。例如,在c语言中函数的声明和定义有两种不同的方式。‘旧’(kernighan和ritchie即k&r)语法虽然现在仍然支持,但是已经被‘函数原型’语法所取代。为避免误用和引入错误,在misra-c中禁止使用k&r语法。很多软件缺陷可通过采取合理限制语言的使用来避免。
misra编码准则
misra编码标准简洁明了,在全球范围内公认为c和c 开发安全关键软件的基准。
misra每个文档都包含一组编码规则,在文档前几章节会介绍背景信息,对于开发健壮代码也是相当重要的。该背景信息强调,对编码规则的严格遵守只是成功的软件开发过程中的一个要素,我们还需适当的编译器和验证工具。
misra-c:1998
编码标准于1998年由misra发布。两个misra成员——福特和路虎,要求prqa帮助他们创建自己的编码标准。通过这项工作,确定了版本一的misra-c基础内容:“汽车电子软件中使用c语言的指导方针”。这个版本包含127个编码规则,并取得了立竿见影的影响。13年后的今天,它仍然被用在许多旧有系统的维护中。
misra-c:2004
misra-c在2004年推出了新版本,对之前的版本进行了改进,并明确了该规则的使用领域。与之前版本相比较,其结构有了很大的改变,增加了一些额外的规则,并保留了原始版本的精髓。值得注意的是,新版本将标题中“汽车行业软件”修订为“关键系统”。这反映出misra-c已经广泛应用于汽车行业之外。
misra-c :2008
尽管c语言是安全关键系统的主要编程语言,但是c 语言的使用仍然保持了稳步增长。在这一背景下,在2008年推出了misra-c 。较之c,c 要复杂的多。所以此编程规则中包含228条规则。
misra-c自动代码
在系统开发中使用建模工具频率大幅增长。从模型自动生成代码的过程灵活、快速。特别是使用建模工具给产品开发周期带来的显著变化使得该优势更加明显。
在遵循应用程序的编码准则情况下自动生成的代码可以说是混乱的根源所在。因为手动代码开发准则并不总适合于自动生成代码。所以misra发布了适用于代码生成工具的misra-c:2004规范。
然而影响自动生成代码质量的并非只是代码生成工具的原因,也可能是在模型设计时就存在了问题。所以misra还出版了一些书籍,用来为在应用程序中使用如simulink和targetlink建模语言提供设计方案和风格指南准则。
misra-c3
目前,misra-c仍然是基于c90语言标准(iso9899:1990)的,而不是后来的c99标准(iso/ iec 9899:1999)。编译器供应商迟迟没有实施c99,是因为人们普遍认为,并不是所有经过修订的标准就代表着进步。特别是可靠性作为一个重要的考虑因素时。即便在今天,大多数嵌入式编译器不提供全面支持所有的附件功能。
misra-c: 2004出版时,决定推迟基于c99语言标准日期。然而,misra-c工作组现已接近完成第三个版本的准则修订。该版本旨在改善较早版本并解决c99的问题。misra-c3的草稿版已经在2012年年初供公众审核。
静态分析
不幸的是,在推行编码准则的过程中面临着很多困难。据观察,许多公司投入相当大的精力编制了一套编码准则,在实施过程中却因难以执行而被放弃。
misra编码准则是很难通过手动代码审查实现有效的执行。传统的代码检查会耗费大量时间,而且并不是很可靠。大多数的编码规则适合于使用工具自动执行。
虽然一些嵌入式编译器会提供一定程度的规则检查,但是专用静态分析工具提供更为全面的检查。通过静态分析工具不仅可确定具体违反规则的地方,也可找出其他编码问题,源码度量计算,通过深度数据流分析确定代码运行时可能会出现的错误。
但并不是每一条misra规则都可通过工具自动执行。也有少数规则是解决文档问题或是规则框架,需要凭借主观判断的。然而绝大多数的misra规则可以非常有效地自动执行。
静态代码分析是一种速度快,功能强大,可靠且可复用的一种技术。每个程序员可单独使用,避免了手动代码审查中很容易出现的争吵现象。
总结
从1998年发布版本一的misra-c规则,misra凭借其良好的声誉成为嵌入式软件开发编码标准的专家,业界的翘楚。
c和c 并不是开发安全关键代码的理想语言,但是它们可通过定义一个安全的语言子集并结合静态分析工具统一执行该规范,来保证代码的可靠性。
有关prqa和作者
prqa与misra之间的关系可追溯到20年前,misra-c和misra-c 的主要准则元素是来自prqa自己的编码标准。并且prqa的技术专家是misra-c和misra-c 工作组的主要成员。prqa的静态分析工具——qa•c和qa•c ,在misra-c和misra-c 依从性检查,以及许多其他有价值的分析能力方面在业内独占鳌头。
本文作者paul burden是prqa开发团队中专门负责qa•c工具的高级成员,同时也是misra-c工作小组工作十年以上的资深成员。
prqa在全球都设有办事处,为世界各地客户提供凯发官方首页的技术支持。请访问其官方网站查询详细信息。
email:
web: