汽车行业软件可靠性联盟(MISRA:Motor Industry Software Reliability Association)的使命为了提高车辆系统中软件的安全性和可靠性,是对汽车工业的软件应用和开发提供相应支持和帮助。MISRA-C的早期目的是为了指导汽车行业中C语言软件的开发,但是,从1998年,MISRA-C已经在汽车工业、航空航天、医疗设备、以及其它工业环境中得到应用和发展。
MISRA-C:2004是MISRA-C:1998的更新版。MISRA-C:2004纠正了软件工程师在实现MISRA-C:1998中存在的问题。为了适合嵌入式系统的开发,本文档描述了一个C语言的子集。它包含一个C编程语言的规则列表以及相应的判断和实例。
C语言在汽车工业中相关实时嵌入式应用软件的使用率和重要性逐渐提高,这主要是源于该语言的灵活性,可扩展性以及潜在的多种平台的可移植性。具体来说,1)C语言可以直接应用于多种硬件平台;2)C语言提供高速、低层、输入/输出操作,而这些往往是很多汽车嵌入式系统需要的;3)应用软件的复杂性使开发人员更乐于选择高级开发语言而不是汇编语言;4)C语言可以产生更小的软件,与其它高级语言相比,使用RAM更少;5)为了降低硬件成本,软件往往被移植到新的低成本的处理器上;6)能够自动产生C语言代码的模型软件包的增长;7)开源系统和家庭环境中不断增加的利润。因此,C语言在实时嵌入式系统中的广泛使用,推动了对C语言安全性能的要求。
任何一种编程语言都无法保证最终的可执行代码完全按照程序员的目的进行活动。C语言中存在哪些非安全因素呢?
程序员的错误。错误变量名称的输入或者是被卷入了晦涩难懂的算法之中。程序员就常常忍受这些错误:1)语言的编程风格和表达可以帮助和阻碍程序员对算法清晰的思考,2)编程语言可以使程序员很容易或者很困难的将一种有效结构通过输入错误转换为另外一个,例如逻辑运算符“==”写成了赋值预算法“=”;3)并且编程语言可以或者不可以检测出这些由他们自己弄出的错误。
程序员对语言理解的错误。最典型的就是运算符优先级问题,程序员往往错误的理解了运算符的优先级而引出问题。
编译器并没有按照程序员的期望进行编译。如果语言特征并没有明确定义,或者很模棱两可,从而使程序员与编译器对同一种结构有两种不同的解释。例如变量的长度问题,不同的编译器对变量长度可能不同。
编译器本身的错误。编译器作为一个软件工具,不可能永远可以正确编译代码,它们可能在某些条件下没有遵循语言标准,或者是含有BUGS。
运行时错误。C语言对运行时检查相当差,这也是为什么C语言代码小且高效的原因,这也源于需要消耗一定的时间和代码去检测错误。最常见的问题是数学异常,溢出,非法指针地址,或数组越界。
从上面的分析结果中可以清晰看到,如果将C语言应用于安全相关系统中,必须要加以小心。同时可以看出,整个C语言不适用于安全相关系统的编程应用。但是,C语言的成熟和应用又吸引了C语言在实时嵌入式系统中的应用。为此,将C语言应用于安全相关系统必须有一定的限制。本文档就列出了针对C语言在安全相关系统中的限制条件。
文档的目的是为了尽力保证最安全的使用C语言;从个人和企业层次上鼓励培训和提高C语言编程能力;强调针对该语言子集的静态检查工具的使用;使汽车工业中相关工程师和管理人员在语言选择上更加清晰。总之,文档的最终目的是使他们的产品更加适合汽车工业的应用。
MISRA-C仅仅适用于ISO标准,而不适用于K&R C,C++,和其它C语言的扩展。由于编码风格和尺寸相当主管,因此,本文档并为包含这些问题。文档仅仅适用于嵌入式系统,因此对于主机系统并不必须。文档中的所有术语遵循ISO/IEC 9899标准。另外,基于该文档的工具或编译器在测试时并不需要实现所有的文档设计规则。关于c++和代码自动产生工具相关问题,读者可以参考MISRA-C:2004的英文版本,这里不再累述。