没有合适的资源?快使用搜索试试~ 我知道了~
提供诸多C语言的编程规范,以助于C代码的编程与阅读
资源推荐
资源详情
资源评论
苏州大学飞思卡尔嵌入式中心 推荐研究生必读资料
MISRA-C-:2004
Guidelines for the use of the C language in critical systems
MISRA-C-2004:工业标准的 C 编程规范
(中文版)
苏州大学飞思卡尔嵌入式中心 推荐研究生必读资料
I
目 录
1 背景 —— C 的使用和问题 ............................................................................................................... 1
1.1 汽车工业中 C 的使用 .............................................................................................................. 1
1.2 语言的不安全性和 C 语言 ...................................................................................................... 1
1.3 安全相关系统中 C 的使用 ...................................................................................................... 2
1.4 标准化 ....................................................................................................................................... 2
2 MISRA-C:视野 ................................................................................................................................... 3
2.1 MISRA-C 的发布说明 .............................................................................................................. 3
2.2 MISRA-C 的目标 ...................................................................................................................... 3
3 MISRA-C:范围 ................................................................................................................................... 4
3.1 基本的语言问题 ....................................................................................................................... 4
3.2 未指出的问题 ........................................................................................................................... 4
3.3 可应用性 ................................................................................................................................... 4
3.4 预备知识 ................................................................................................................................... 4
3.5 C++问题 ..................................................................................................................................... 4
3.6 自动产生代码的问题 ............................................................................................................... 5
4 使用 MISRA-C ..................................................................................................................................... 6
4.1 软件工程环境 ........................................................................................................................... 6
4.2 编程语言和编码环境 ............................................................................................................... 6
4.3 采用子集(subset) ................................................................................................................. 8
4.4 符合性声明(Claiming compliance) ..................................................................................... 9
4.5 持续改进 ................................................................................................................................. 10
5 规则简介 .............................................................................................................................................11
5.1 规则分类 ..................................................................................................................................11
5.2 规则的组织 ..............................................................................................................................11
5.3 规则的冗余 ..............................................................................................................................11
5.4 规则的形式 ..............................................................................................................................11
5.5 理解原始参考 ......................................................................................................................... 12
5.6 规则的范围 ............................................................................................................................. 13
6 规则 .................................................................................................................................................... 14
6.1 环境 ......................................................................................................................................... 14
6.2 语言扩展 ................................................................................................................................. 14
6.3 文档 ......................................................................................................................................... 15
6.4 字符集 ..................................................................................................................................... 16
6.5 标识符 ..................................................................................................................................... 16
6.6 类型 ......................................................................................................................................... 18
6.7 常量 ......................................................................................................................................... 19
6.8 声明与定义 ............................................................................................................................. 20
6.9 初始化 ..................................................................................................................................... 21
苏州大学飞思卡尔嵌入式中心 推荐研究生必读资料
II
6.10 数值类型转换 ....................................................................................................................... 22
6.11 指针类型转换 ....................................................................................................................... 30
6.12 表达式 ................................................................................................................................... 31
6.13 控制语句表达式 ................................................................................................................... 35
6.14 控制流 ................................................................................................................................... 37
6.15 switch 语句 ............................................................................................................................ 40
6.16 函数 ....................................................................................................................................... 42
6.17 指针和数组 ........................................................................................................................... 43
6.18 结构与联合 ........................................................................................................................... 45
6.19 预处理指令 ........................................................................................................................... 48
6.20 标准库 ................................................................................................................................... 52
6.21 运行时错误 ........................................................................................................................... 54
7 References ........................................................................................................................................... 56
Appendix A: Summary of rules .............................................................................................................. 57
Appendix B:MISRA-C :1998 到 MISRA-C :2004 规则映射 ........................................................... 62
Appendix C:MISRA-C:1998 – 已废除的规则 ..................................................................................... 69
Appendix D:ISO 标准交互参考 ........................................................................................................ 70
Appendix E : 术语表 ............................................................................................................................. 74
MISRA-C-2004:工业标准的 C 编程规范
1
1 背景 —— C 的使用和问题
1.1 汽车工业中C 的使用
MISRA-C:1998 [1] 发布于 1998 年。本文档是它的修订版本,用来解决与第一版本有关系的问题。在
汽车工业领域的实时嵌入式应用中,C 编程语言的使用越来越体现出广泛性和重要性。这在相当程度上
取决于该语言固有的灵活性、可支持的范围及其潜在的访问广泛硬件环境的可移植性。详细的理由包括:
对于许多使用中的微处理器来说,如果存在其他除了汇编语言之外的可用语言,通常就是 C。
在许多情况下,其他语言根本就不可用于硬件。
C 对高速、底层、输入/输出操作等提供了很好的支持,而这些特性是许多汽车嵌入式系统的基
本特性。
由于应用的逐步增长的复杂性,高级语言的使用较汇编语言更为适合。
相对于其他一些高级语言,C 能够产生较小的和较少 RAM 密集性(RAM-intensive)的代码。
增长的可移植性需求。市场竞争要求在工程项目生命周期的任何阶段,软件可以通过移植到新
的和/或低成本的处理器,目的是为了降低硬件成本。
增长的自动产生 C 代码的使用要求。C 代码需要从模型包中自动产生。
增长的对开放系统和主机环境(hosted enviroments)的兴趣。
1.2 语言的不安全性和C 语言
没有哪种编程语言能够保证最终的可执行代码会准确地按照程序员预想的那样执行。任何语言都会产
生大量的问题,下面为其做了广泛的分类,并描述了 C 语言不安全性的例子。
1.2.1 程序员产生错误
程序员产生的错误,简单的可以是变量名字的书写错误,或者更为复杂的错误,如对算法的误解。编
程语言可以承受这样的错误。首先,语言的风格和表达能帮助或提示程序员清晰考虑其算法。其次,对于
书写错误,语言可以使从一个有效结构向另一个有效(不是预想的)结构的转换变得轻松或困难。第三,
当错误发生时,语言可以检测到也可能检测不到。
首先,关于语言的风格和表达,使用 C 可以编写出良好布局的、结构化的和表达性强的代码。还可
以使用它编写出不正当的和特别难以理解的代码。很明显,后者对于安全相关的系统是不可接受的。
其次,C 的语法特性足以使得书写错误也能产生完全有效的代码。例如,在“==”(逻辑比较)
的地方写成“=”(赋值)是很常见的,而且最终结果也几乎总是有效的(但它是错误的);而 if 语句
的结尾出现的多余分号能完全改变代码逻辑。
第三,C 的基本观点是假设程序员知道他们在做什么,这意味着错误即使出现也不会被语言注意到
而通过。在这方面 C 体现出的软弱性正在于它的“书写检查”(type checking)。举例来说,C 不会拒
绝程序员在使用整数代表 true/false 值时却在该整数中存储了浮点值。大多数这样的失配可以简单地通过
强制使其合适。如果 C 的表现不得其所(a square peg and a round),它不会挑剔而会适合它们!
1.2.2 程序员不了解语言
程序员可能会误解语言构造的作用。对这样的误解,一些语言是更为开放的。
C 语言中有相当多的地方能使程序员轻易产生误解。例如运算符优先级的规则。这些规则是良好定
义的,但也非常复杂,也很容易对某特定表达式中运算符的优先级做出错误的假设。
1.2.3 编译器的行为同程序员预期的不同
如果语言具有未经完善定义的特性,或者模糊特性,那么在程序员认为某个构造应该如此时,编译器
的解释却是完全不同的。
C 语言中许多地方是未经完善定义的,因此其行为可能会随着编译器的改变而改变。某些情况下,
MISRA-C-2004:工业标准的 C 编程规范
2
其行为甚至在同一个编译器内也会根据上下文而发生变化。Annex G 中所有的 C 标准列出了 201 个这种
问题。这可以提出相当多的问题,特别是在面临编译器间的移植性时。然而,C 标准 [2] 列出了这些问
题,所以它们能为我们所知。
1.2.4 编译器包含错误
语言的编译器(及其链接器等)本身就是软件工具。编译器可能不会始终正确地编译代码。例如,在
特定环境下它们可能同语言标准相违背,或者其本身可能就包含“bug”。
因为 C 语言中存在许多难以理解的地方,编译器的编写者很容易错误地解释和实现标准。语言的某
些地方比其他的更容易这样。而且编译器的编写者有时会有意改变标准。
1.2.5 运行时错误
有些不同的语言问题产生自正确编译的代码,但某些特殊数据会在代码运行时产生错误。语言能够对
可执行代码内部做运行时的检查以检测这样的错误并执行适当的动作。
通常,C 的运行时检查能力比较弱。这也是 C 代码短小有效的原因之一,但是在运行中检查错误就
要花费一定的代价。C 编译器通常不为某些常见问题提供运行时检查,诸如数学异常(如零除)、溢出、
指针地址的有效性,或数组越界错误。
1.3 安全相关系统中C 的使用
从 1.2 节可以清楚地知道,在安全相关系统中使用 C 语言需要相当小心。针对上面提及的问题种类,
已经为安全相关系统中 C 的使用提出了许多需要关注的事情。显然地,不能为安全相关系统使用所有的
C 语言特性。
然而,做为语言来说,C 是非常成熟的,在实践中也是经过了良好分析和使用的。所以它的不足也
是众所周知和可以理解的。同时可获得大量的商业工具支持,这些工具用来静态检查 C 源代码和提醒程
序员语言问题的存在。
如果为了实践的原因有必要在安全相关系统中使用 C 语言,那么必须对语言的使用加以限制,避免
那些确实可以产生问题的地方,直到它是可以应用的。本文档为人们提供了这样的限制集合(通常称为“语
言子集”(language subset))。
Hatton [3] 认为,倘若强加了“„„严格和自动的强制性约束„„”,那么 C 能够写出“„„至少同
其他通用语言一样的具有高质量和一致性的软件”。
注意,相对于 C 语言,汇编语言不再适合于安全相关系统,在某些方面还会更坏。通常不建议在安
全相关系统中使用汇编语言,即使使用也要加以非常严格的约束。
1.4 标准化
本文档使用的标准是由 ISO 9899:1990 [2] 定义的 C 编程语言,它是由 ISO/IEC9899/COR1:1995 [4]、
ISO/IEC 9899/AMD1:1995 [5]和 ISO/IEC 9899/COR2:1996 [6]修订的。为了简便,本文档中统称为“C90”。
基本的 1990 年文档[7]是 ANSI X3.159-1989 [2]的 ISO 版本。在内容上,ISO/IEC 标准同 ANSI 标准是一
致的。然而要说明的是,两个标准中章节的编号是不同的,本文档的章节编号随同 ISO 标准。
还要说明的是,ANSI 标准[7]包含了一个有用的附录,其中在某些由标准委员会制定的决策后给出了
相关的说明解释。ISO 版本中没有这样的附录。
工作小组已经开始考虑 ISO/IEC 9899:1999[8](称为“C99”)。在本文档的发布日期(2004 年 10 月),
还没出现嵌入了 C99 的商业编译器。
剩余76页未读,继续阅读
资源评论
LIGHTREASURE
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功