21.C语言编码规则2.0

更新时间:2023-09-13 03:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

1 背景说明 ..................................................................................................................................................... 1 2 背景说明 ..................................................................................................................................................... 1 3 参考资料 ..................................................................................................................................................... 1 4 准则细则 ..................................................................................................................................................... 1

准则1:对基本类型声明和使用。(推荐)........................................................................................... 1 准则2:过程名禁止被重用。(强制) .................................................................................................. 2 准则3:标号名禁止被重用。(强制) .................................................................................................. 2 准则4:一个文件中的程序总行一般不得超过2000行。(参考) ..................................................... 3 准则5:一个过程(函数、子程序)中的程序总行一般不得超过200行。(参考) ........................... 3 准则6:严格审查条件判别的then分支中无任何执行语句的情况。(强制) ................................. 3 准则7:严禁将过程声明为指针类型。(强制) ................................................................................... 3 准则8:禁止直接从过程中跳出。(强制)........................................................................................... 4 准则9:严格审查条件判别的else分支中无任何执行语句的情况。(强制) ................................. 4 准则10:禁止在非赋值表达式中出现了赋值操作符。(强制) ......................................................... 5 准则11:过程体必须用大括号括起来。(强制) ............................................................................... 6 准则12:循环体必须用大括号括起来。(强制) ................................................................................. 6 准则13:then/else中的语句必须用大括号括起来。(强制) ........................................................ 6 准则14:尽量避免使用goto语句。(强制) ..................................................................................... 7 准则15:尽量避免将过程定义为参数。(推荐) ............................................................................... 7 准则16:禁止在结构体定义中含有空域。(强制) ........................................................................... 8 准则17:禁止声明多重标号。(强制) ............................................................................................... 8 准则18:过程中避免使用过多的参数,最多不要超过20个。(参考) ......................................... 8 准则19:尽量避免过程参数在过程调用中未被使用。(推荐) ....................................................... 9 准则20:参数必须使用类型声明。(强制) ....................................................................................... 9 准则21:实参与形参个数必须一致。(强制) ................................................................................... 9 准则22:禁止使用一些模糊的语句。(强制) ................................................................................. 10 准则23:禁止某个过程在其所在的文件中没被任何调用。(强制) ............................................... 10 准则24:尽量避免使用不加以分析的注释。(推荐) ........................................................................ 11 准则25:禁止switch语句的case中无语句。(强制) .................................................................... 11 准则26:使用无限循环必须严格审查。(强制) ............................................................................... 12 准则27:禁止返回类型说明为void的过程中有retum语句返回值。(强制) ............................. 12 准则28:尽量避免使用“+=”或“-=”操作符。(推荐) ............................................................. 12 准则29:使用“++”或“一”操作符必须格外小心。(推荐) ..................................................... 13 准则30:禁止在循环中使用break语句。(强制) ......................................................................... 13 准则31:尽量避免使用continue语句。(强制) ........................................................................... 14 准则32:尽量避免使用三重的表达式。 ........................................................................................... 14 准则33:在过程声明中必须对参数说明。(强制) ......................................................................... 15 准则34:返回类型为static的过程在其所在文件中必须被调用。(强制) ............................... 15 准则35:函数必须有返回语句。(强制) ......................................................................................... 16 准则36:禁止过程参数只有类型没有标识符。(强制) ................................................................. 16 准则37:禁止使用不合适的循环变量类型。(强制) ..................................................................... 17 准则38:循环变量必须是局部声明的。(强制) ............................................................................... 17 准则39:禁止在过程参数表中使用省略号。(强制) ....................................................................... 18

1 准则40:禁止在结构体定义中使用位域。(强制) ........................................................................... 18 准则41:尽量避免使用setimp/longjmp。(推荐) ........................................................................ 19 准则42:禁止使用禁用的过程,函数,文件或名称。(强制) ....................................................... 19 准则43:禁止重新定义使用C关键字。(强制) ............................................................................... 19 准则44:禁止在禁止使用extern的文件中使用了extem。(强制) .............................................. 20 准则45:数组使用必须保证不会出现越界。(强制) ....................................................................... 20 准则46:在switch语句中必须有defult语句。(强制) ............................................................. 20 准则47:逻辑表达式的连接必须使用大括号。(强制) ................................................................. 21 准则48:禁止对有符号类型进行移位运算。(强制) ..................................................................... 21 准则49:对变量进行移位运算必须保证不会产生溢出。(强制) ................................................. 22 准则50:禁止给无符号变量赋负值。(强制) ................................................................................. 22 准则51:尽量避免使用逗号操作符。(推荐) ................................................................................. 23 准则52:谨防长度操作符sizeof的副作用。(强制) ..................................................................... 23 准则53:禁止同一个表达式中调用多个的函数。(强制) ............................................................... 23 准则54:禁止对实数类型的量做是否相等的比较。(强制) ........................................................... 24 准则55:尽量避免使用不起作用的语句。(推荐) ........................................................................... 24 准则56:尽量避免使用空语句。(推荐) ......................................................................................... 25 准则57:在if语句中应有else分支。(推荐) ............................................................................... 25 准则58:禁止switch语句中为空。(强制) ..................................................................................... 26 准则59:禁止switch语句中只包含default语句。(强制) ....................................................... 26 准则60:禁止switch语句中的case语句没有由break终止的。(强制) ................................... 26 准则61:禁止procedure/function(过程/函数)中参数表为空。(强制) ................................ 27 准则62:禁止返回类型说明为Void的过程用在表达式中。(强制) ............................................. 27 准则63:禁止void类型的变量作为参数进行传递。(强制) ......................................................... 28 准则64:禁止函数中只有一个return空语句而没有返回值。(强制) ....................................... 28 准则65:尽量避免在一个块中使用#define。(推荐) ..................................................................... 29 准则66:禁止使用#undef。(强制)................................................................................................... 29 准则67:谨慎使用#pragma。(推荐) .................................................................................................. 30 准则68:谨慎使用指针的逻辑比较。(推荐) .................................................................................... 30 准则69:禁止参数指针赋值给过程指针。(强制) ............................................................................ 30 准则70:有符号类型的位长度必须大于等于两位。(强制) ......................................................... 31 准则71:位的定义必须是有符号整数或无符号整数。(强制) ........................................................ 31 准则72:谨慎使用联合(union)的声明。(推荐) ................................................................................ 31 准则73:禁止在头文件前有可执行代码。(强制) ............................................................................ 32 准则74:禁止在宏中使用了多个#或##。(强制) .............................................................................. 32 准则75:禁止定义不象函数的宏。(强制) ........................................................................................ 32 准则76:宏参数必须用括号括起来。(强制) .................................................................................... 33 准则77:禁止在宏中包含不允许的项。(强制) ............................................................................. 33 准则78:指针的指针不能超过两级。(强制) .................................................................................... 33 准则79:禁止三字母词的使用。(强制) ............................................................................................ 34 准则80:逻辑表达式应采用显式的表达。(推荐) ......................................................................... 34 准则81:谨慎使用八进制数。(推荐) ................................................................................................ 34 准则82:谨慎使用寄存器变量。(推荐) ............................................................................................ 35 准则83:枚举元素的初始化必须完整。(强制) ................................................................................ 35 准则84:禁止重新定义保留字。(强制) ............................................................................................ 35

2 准则85:谨慎对指针进行代数运算。(推荐) .................................................................................... 36 例如86:当嵌入汇编程序时,嵌入过程必须是纯汇编程序。(强制) ............................................ 36 准则87:字符类型必须标明是有符号还是无符号。(强制) ............................................................ 37 准则88:禁止对一个名字重新定义。(强制) .................................................................................... 37 准则89:禁止重复使用同一个名字。(强制) .................................................................................... 37 准则90:禁止给变量赋的值与变量的类型不一致。(强制) ............................................................ 38 准则91:禁止对指针变量使用强制类型转换。(强制) .................................................................... 38 准则92:谨慎将其它类型变量强制转换为指针类型。(推荐) ........................................................ 39 准则93:谨慎使用混合运算方式。(推荐) ........................................................................................ 39 准则94:尽量避免使用不必要的类型转换。(推荐) ........................................................................ 39 准则95:禁止实参和形参类型不一致。(强制) ................................................................................ 40 准则96:尽量不要以非调用方式使用函数。(推荐) ........................................................................ 40 准则97:头文件名不能使用“‘”、“\”和“/”等字符。(强制) ................................................. 41 准则98:函数返回类型必须一致。(强制) ........................................................................................ 41 准则99:函数和原型返回类型必须一致。(强制) ............................................................................ 41 准则100:函数和原型参数类型必须一致。(强制) .......................................................................... 42 准则101:结构体变量初始化的类型必须一致。(强制) .................................................................. 42 准则102:结构体变量初始化的嵌套结构必须一致。(强制) .......................................................... 43 准则103:变量使用前必须被赋值过。(强制) .................................................................................. 43 准则104:注意三重表达式中的类型匹配。(推荐) .......................................................................... 43 准则105:赋值类型必须匹配。(强制) .............................................................................................. 43 准则106:数组下标必须是整型。(强制) .......................................................................................... 44 准则107:尽量不使用单行注释“//”。(推荐) .................................................................................. 44 准则108:用typedef自定义的类型名禁止被重新定义。(强制) .................................................... 44 准则109:谨慎在源程序中使用非;隹则字符。(推荐) .................................................................. 45 准则110:禁止表达式不是逻辑表达式。(强制) .............................................................................. 45 准则111 禁止不要使用不正确的终止字符串。(强制) .................................................................. 46 准则112:禁止局部变量与全局变量同名。(强制) .......................................................................... 46 准则113:禁止对常数值做逻辑非的运算。(强制) .......................................................................... 46 准则114:main函数必须为int(void)或int(int,char*[])。(强制) ................................................... 47 准则115:禁止使用嵌套的注译。(强制) ....................................................................................... 47 准则116:禁止对有符号类型使用位运算。(强制) .......................................................................... 48 准则117:switch语句中的表达式禁止是逻辑表达式。(强制) ....................................................... 48 准则118:谨慎使用abort,exit等函数。(推荐) .............................................................................. 49 准则119:禁止枚举类型的越现使用。(强制) ............................................................................... 49 准则120:变量的使用禁止超出所定义的范围(强制) ................................................................. 49 准则121:谨慎在宏中使用“##”或“#”。(推荐) ............................................................................ 49 准则122:禁止在同一个文件中有#if而没有#endif。(强制) .......................................................... 50 准则123:禁止数组没有边界限定。(强制) ...................................................................................... 50 准则124:禁止参数与全局变量同名。(强制) .................................................................................. 50 准则125:禁止参数与类型或标识符同名。(强制) .......................................................................... 51 准则126:禁止在#include<…….>中使用绝对路径名。(强制) ................................................... 51 准则127:禁止在内部块中重新使用某名字。(强制) ...................................................................... 51 准则128:禁止在逻辑表达式中使用赋值操作符。(强制) .............................................................. 52 准则129:禁止赋值操作符与“&&”或“||”连用。(强制) .......................................................... 52

3 准则130:禁止在复杂的表达式中使用volatile类型的变量。(强制) ............................................ 53 准则131:避免使用老的参数表定义形式。(推荐) .......................................................................... 53 准则132:禁止位操作符带有布尔型的操作数。(强制) .................................................................. 54 准则133:禁止位操作符作用干布尔值。(强制) .............................................................................. 54 准则134:禁止在结构体中使用无名位域。(强制) .......................................................................... 54 准则135:避免由于设计的原因导致某些代码不能执行。(推荐) .................................................. 55 准则136:避免无法控制的循环条件。(推荐) .................................................................................. 55 准则137:禁止结构体声明不完整。(强制) ...................................................................................... 56 准则138:禁止参数的声明形式上不一致。(强制) .......................................................................... 56 准则139:禁止变量在定义前被使用。(强制) .................................................................................. 56 准则140:字符串数组的赋值必须再所分配的空间之内。(强制) .................................................. 57 准则141:枚举类型的变量的成员必须初始化为整型。(强制) ...................................................... 57 准则142:禁止将枚举类型变量用作算术操作的操作数。(强制) .................................................. 57 准则143:避免对无符号数进行大于等于零或小于零的比较。(推荐) .......................................... 58 准则144:避免声明了标号但不使用的情况。(推荐) ...................................................................... 58 准则145:避免当switch语句的表达式是枚举类型时缺少case分支。(推荐) ............................. 58 准则146:禁止移位操作符中的右操作数为负数。(强制) .............................................................. 59 准则147:禁止sizeof操作符的操作数是类型。(强制) .................................................................. 59 准则148:禁止sizeof的参数是数组类型的函数参数。(强制)....................................................... 59 准则149:禁止声明为数组的形式参数有固定的大小。(强制) ...................................................... 60 准则150:禁止声明的函数参数类型不完整。(强制) ...................................................................... 60 准则151:禁止&&、||或!操作符的操作数不是布尔型。(强制) .................................................. 60 准则152:禁止两个布尔型变量进行比较。(强制) .......................................................................... 61 准则153:禁止函数、变量或常量使用不同的类型重定义。(强制) .............................................. 61 准则154:禁止引用空指针。(强制) .................................................................................................. 62 准则155:禁止在存储空间释放后再使用该存储空间。(强制) ...................................................... 62 准则156:分配存储空间在返回或退出活动范围时必须释放。(强制) .......................................... 63 准则157:禁止引用堆栈,即当函数返回时一个外部变量指向堆栈区。(强制) .......................... 63 准则158:禁止修改或释放字符串常量。(强制) .............................................................................. 63 准则159:禁止声明了函数、变量或常量等,但是在程序中未被使用的情况。(推荐) .............. 64 准则160:数组的初始化必须完整。(强制) ...................................................................................... 64 准则161:禁止声明了类型但未使用的情况。(推荐) ...................................................................... 64 准则162:禁止对同一函数作多次定义。(强制) .............................................................................. 65 准则163:禁止对同一函数作多次声明。(强制) .............................................................................. 65 准则164:禁止在函数体内使用外部声明。(强制) .......................................................................... 65 准则165:禁止局部变量与全局变量重名。(强制) .......................................................................... 66 准则166:禁止函数、变量或常量声明了但未定义的情况。(强制) .............................................. 66 附录A与MISRA 和 LDRA标准的对应关系 ........................................................................................ 67 附录B准则分类索引................................................................................................................................... 72

4

1 背景说明

依据第一版的试用情况,第二版修改了若干条准则,包括删除了4条准则,并进行了替换,新补充了28条准则(准则139-准则166)。

2 背景说明

1998年,国际发动机工业软件可靠性协会MISRA(Motor Industry Software Reliability

Association)组织制定了“汽车软件C语言使用指南”的标准。这份标准的产生庄自动化行业极大地推动了使用“安全的C”进行编程。这份标准在汽车行业被广泛接受,同时它也被其它行业所广泛借鉴。 利物浦数据研究协会LDRA (Liverpool Data research Associa5es)作为专业软件测试协会建立于1975年。LDRA Testbed软件测试工具可基于MISRA的C语言使用标准对C语言程序进行检查,以帮助用户们在程序代码上加强行业际准的执行。

本标准是在MISRA和LDRA的标准基础上,结合我国军工软件开发实际情况,进行适当裁剪和修订而形成的。本标准的准则分为推荐和强制两种类型,所有准则都经过了ViSUal C++的编译实验,对Visual C++编译器能识别的准则部进行了注释说明。

3 参考资料

[1] 《Guidelines For The Use Of The C Language In Vehicle Based Software》,MISRA, 1998. [2] 《LDRA Testbed and MISRA C Checking》,@2000 LDRA Ltd, Version 2.0.

4 准则细则

准则1:对基本类型声明和使用。(推荐)

在不同的编译程序中基本类型的长度是大不相同的,因此鼓励在统一的一个变量声明头 文件中使用typedef定义软件使用的变量类型,而在除此之外的程序中禁止使用基本类型的 声明。这条准则是为了使代码易于移植。

例如,在头文件c_standards.h中定义:

typedef unsigned int UINT_32; typedf int SINT_32; typedef unsigned short………………………………………………. typedef unsigned char UCHAR; typedef float FLOAT_32; typedef double FLOAT_64; 在程序中的使用如下: #include “c_standards.h” void p (void) {

1

本文来源:https://www.bwwdw.com/article/gdih.html

Top