热度 16
2011-11-16 15:45
3804 次阅读|
7 个评论
声明如下: 1、最近频繁出差和几个项目的攻关,实在未能抽出时间写文章贡献,愧对大家,正努力改进中; 2、嵌入式软件可靠性之于系统的重要性,如女主人之于家庭的重要性,须谨慎对待之。若欲做好,可研究下军工嵌入式软件设计规范、汽车控制电子MISRA设计规范、医疗电子报警和可使用性设计规范、GJB5000军工软件能力成熟度模型四个方面的内容。如下文章是MISRA的原版翻译稿,先供参考。后续相关不少内容持续写作中...... 开发环境 规则 1.1 所有代码应该遵循ISO 9899:1990 C语言编程规范,该规范根据如下标准修订: ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995, 和 ISO/IEC 9899/COR2: 1996 规则 1.2 不应该依赖于没有定义或不明确的行为. 规则 1.3只有当目标代码的语言/编译器/汇编器符合统一定义的接口标准的时候,才能使用多个编译器或多种语言。 规则 1.4应该检查编译器/链接器,确保外部标识符能够支持31个区分大小写有效字符。 规则 1.5浮点实现应该遵守定义的浮点标准 语言扩展 规则 2.1汇编语句应该被封装并且隔离。 规则 2.2源代码只能使用C风格的注释。 规则 2.3字符串 /* 不应该在注释中出现。 规则 2.4代码段不应该被注释掉。 文档化 规则 3.1所有使用已定义实现行为的地方都应该文档化。 规则 3.2所使用的字符集和相应的编码应该文档化。 规则 3.3在所选编译器中实现的整除运算,应该具有确定性,并记录下来予以考虑。 规则 3.4所有使用的 #pragma 命令都应该文档化并做出解释。 规则 3.5如果被依赖,应该对已定义实现的行为和位域封装在文档中进行记录。 规则 3.6所有产品代码中使用的库都应该与遵守本文的规定,并经过适当的验证。 字符集 规则 4.1只能够使用在ISO C标准中定义的换码符。 规则 4.2不允许使用三元符。 标识符 规则 5.1标识符(内部或外部)不应该依赖于超过31个字符表示的意义 规则 5.2内部标识符不应该与外部标示符重名,否则应隐藏该标识符。 规则 5.3 一个typedef的名称应该具有唯一的标识符。 规则 5.4标签名应该具有唯一的标识符。 规则 5.5静态存储的对象或函数的标识符不应该被重用。 规则 5.6一个命名空间中的标识符不能与其它命名空间中的标识符重名,结构和联合体成员的名称除外。 规则 5.7不应该重用标识符名称。 数据类型 规则 6.1 (普通)Char类型只能用来存储使用字符 规则 6.2 Signed和unsigned char只能用于存储和使用数值。 规则 6.3 应使用显示大小和符号的typedef来代替基本数据类型。 规则 6.4 位域只能用于所定义的 unsigned int 或 signed int 类型。 规则 6.5 signed int的位域至少为2个位长度 常量 规则 7.1 不应使用八进制常数(0除外)或八进制转义字符。 声明和定义 规则 8.1 函数应有原型声明,且该原型应在函数定义和调用处出现。 规则 8.2任何时候定义或声明的对象或函数应显示说明其类型。 规则 8.3每个函数中输入和返回参数的定义和声明的类型应该一致。 规则 8.4多次声明的对象或函数,其类型应相互兼容。 规则 8.5头文件中不应出现对象或函数的定义。 规则 8.6函数应定义在文件范围内。 规则 8.7仅在单个函数内访问的对象应定义在块范围内。 规则 8.8一个外部对象或函数应该在一个并且只有一个文件中声明。 规则 8.9具有外部链接的标识符应有唯一的外部定义。 规则 8.10文件范围内函数或对象的所有声明和定义应该具有内部链接,否则应具有外部链接。 规则 8.11静态存储类关键字应在有内部链接的对象和函数的定义和声明中使用。 规则 8.12声明为外部链接的数组,应显示说明其大小或在初始化时清楚的定义. 初始化 规则 9.1 所有自动变量应该使用前应该赋值。 规则 9.2括号应该用于指示和匹配非零初始化的数组和结构体的结构。 规则 9.3在枚举列表中,除非同时显式初始化所有成员,不应使用'='构造单独对第一个之外的个别成员显式初始化。 算术类型转换 规则 10.1 以下情况下,整型表达式中不允许出现隐式数据类型转换: a)整型操作数不是被扩充为更多位数的同符号整数; b)表达式是复杂表达式; c)表达式不是常数表达式,且是函数的参数; d)表达式不是常数表达式,且是函数的返回表达式。 规则 10.2以下情况下,浮点数表达式中不允许出现隐式数据类型转换: a)浮点型操作数不是被扩充为更多位数的同符号浮点数; b)表达式是复杂表达式; c)表达式是函数的参数; d)表达式是函数的返回表达式。 规则 10.3复杂的整型变量转化为窄整型变量时必须按照如下的方式使用强制转换。 规则 10.4复杂浮点类型的变量可以转换成窄浮点类型变量。 规则 10.5当位操作符~和移位操作符(或)的操作对象为unsigned char或者unsigned short类型时,其运算结果必须先显式转换为对应的数据类型。 规则 10.6所有无符号常数应加 “U”后缀。 指针类型转换 规则 11.1 指向函数的指针不能转化为除整型以外的其它任何类型。 规则 11.2指向对象的指针只能转换为整型,或者指向同类型对象的其他指针,或者是void类型。 规则 11.3指针和整型类型之间不应该做类型转换. 规则 11.4不同数据类型指针之间不应该做类型转换. 规则 11.5对指针进行类型转换时不允许将限定词const和volatile删除。 表达式 规则 12.1表达式中有限制的依赖应建立在C语言的优先级规则之上。 规则 12.2表达式的结果在标准允许的任何顺序的计算情况下都应该是一样的。 规则 12.3 sizeof操作符不能用在包含副作用的表达式上。 规则 12.4逻辑操作符 或 || 的右侧操作数不应带有副作用。 规则 12.5逻辑操作符 或 || 的操作数应作为主要表达式。 规则 12.6逻辑操作符(, || , !) 的操作对数应该是有效布尔型。有效布尔型表达式不应该与除逻辑操作符(, || ,!)之外的其他的操作符一起运算。 规则 12.7位操作符的操作数的潜在数据类型不应为有符号数。 规则 12.8移位操作时,操作符右侧的操作数的数值应大于于0,且小于左侧操作潜在数据类型的位长度。 规则 12.9一元负号操作符不应在潜在无符号数据类型的表达式中出现。 规则 12.10不应使用逗号操作符。 规则 12.11赋值表达式中使用无符号整形操作数时不应导致循环溢出。 规则 12.12不得使用任何形式的潜在位来表示浮点。 规则 12.13位操作符的操作数的潜在数据类型不应为有符号数。 控制语句表达式 规则 13.1在返回布尔值的表达式中不应使用赋值操作符。 规则 13.2判断一个值是否为0 应该是显式的,除非该操作数是一个布尔值。 规则 13.3不允许对浮点数进行相等或者不相等的比较,即使是非直接的比较也是不允许的。 规则 13.4浮点变量不应作为循环计数器使用。 规则 13.5只有与循环控制相关的表达式才会出现在for语句中。 规则 13.6在一个循环中用于迭代计算的数字变量不得在循环体内修改变量值。 规则 13.7布尔表达式的值必须是可以改变的。 控制流 规则 14.1不应有不可达代码。 规则 14.2非空语句应产生副作用,或者使控制流改变。 规则 14.3一行中如果有空语句,那么该行只能有这条空语句,不能有别的语句,并且在这条空语句前不能有注释,注释必须在其后,用空格隔开。 规则 14.4不应使用goto语句。 规则 14.5不应使用continue 语句。 规则 14.6循环体中最多只能出现一个break 语句用于结束循环。 规则 14.7函数只应有一个出口,这个出口必须在函数末尾。 规则 14.8 switch , while, do… while 和for 语句的主体应是复合语句,即使该主体只包含一条语句。 规则 14.9 if 结构后面应是一个复合语句(即用大括号包含) ,else 后面必须是一个复合语句(即用大括号包含) 或者另一个if 语句。 规则 14.10 if …else if 结构应由一个else子句结束。(未完待续) MISRA:2004 嵌入式软件可靠性设计规范(2)