GB T 28169-2011 嵌入式软件.C语言编码规范.pdf

上传人:cleanass300 文档编号:257917 上传时间:2019-07-13 格式:PDF 页数:28 大小:622.12KB
下载 相关 举报
GB T 28169-2011 嵌入式软件.C语言编码规范.pdf_第1页
第1页 / 共28页
GB T 28169-2011 嵌入式软件.C语言编码规范.pdf_第2页
第2页 / 共28页
GB T 28169-2011 嵌入式软件.C语言编码规范.pdf_第3页
第3页 / 共28页
GB T 28169-2011 嵌入式软件.C语言编码规范.pdf_第4页
第4页 / 共28页
GB T 28169-2011 嵌入式软件.C语言编码规范.pdf_第5页
第5页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、ICS 35.060 L 74 道B中华人民共和国国家标准G/T 28169-2011 嵌入式软件C语言编码规范Embedded software-C language coding specification 2011田12-30发布2012-06-01实施数码防伪中华人民共和国国家质量监督检验检茂总局中国国家标准化管理委员会发布GB/T 28169-2011 目次前言. . . . . . . 1lI 引言.凹1 范围-2 规范性引用文件3 术语和定义.4 编码规范要求4. 1 总体要求.4.2 内存空间管理类.2 4. 3 中断处理类.3 4.4 系统接口类. 3 4.5 硬件系统初始化

2、类.34.6 软件模块初始化类.4.7 版面书写类.4 4.8 声明定义类.4.9 控制语句类4. 10 类型转换类.10 4.11 指针、数组使用类.4.12 运算处理类.14 4.13 函数使用类4. 14 冗余类174. 15 程序效率类.17 5 符合性.18 附录A(资料性附录)符合性矩阵.参考文献.20I GB/T 28169-2011 目。吕本标准按照GB/T1. 12009给出的规则起草。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口。本标准起草单位:中国电子技术标准化研究所、珠海

3、南方软件产品检测中心、炬力集成电路设计有限公司、珠海许继电气有限公司、珠海优特电力科技股份有限公司、东信和平智能卡股份有限公司、深圳市吉阳自动化科技有限公司、上海博泰悦臻电子设备制造有限公司、珠海银邮光电技术发展股份有限公司、上海嵌入式系统应用工程技术研究中心、上海超算并行软件有限责任公司、上海鲁齐信息科技有限公司、大连共创软件有限公司等。本标准主要起草人z侯建华、潘海洋、杨哲军、张展新、张亚伟、罗庆霞、齐建华、陈勇、张肠肠、阳如坤、于晓菁、代玉宏、吴智凯。皿GB/T 28169-2011 引嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、可靠性、成本、体积和

4、功耗严格要求的专门计算机系统。嵌入式系统几乎包括了生活中所有的电器设备,还广泛应用于船舶、机床、仪表、工业自动化仪表及航空航天等领域。尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统应用而设计的。因此,需要制定针对嵌入式系统软件的编码规范要求。本标准是在理解标准C语言的基础上,结合嵌入式软件的开发实践以及嵌入式软件开发中常见的不规范编码方式制定的,着重于软件的安全性、可读性,既可作为嵌入式软件开发中的编码要求,也可作为软件交付时验收方的验证要求。N GB/T 28169-2011 嵌入式软件C语言编码规范1 范围本标准规定了使用C语言在嵌入式软件编程中的规范要求。本标准也

5、给出了在嵌入式系统开发中应该注意的与编码相关的事项。本标准适用于嵌入式软件生存周期的C语言的设计、编码、测试及其使用。2 规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T 15272 程序设计语言C 3 术语和定义GB/T 15272界定的以及下列术语和定义适用于本文件。3. 1 副作用side effect 在表达式执行后对程序运行环境可能会造成影响。赋值语句、自增等操作都是典型的具有副作用的操作。4 编码规范要求4. 1 总体要求4. 1. 1 编程前应阅读硬件

6、电路和芯片资料熟悉芯片的各种存储器(区)、寄存器地址、中断服务、定时器、通讯接口等功能,必要时应将相关信息加入程序注释中。4. 1. 2 编程中应注意程序的存储空间一一-如指令空间大小、数据空间大小、堆枝空间大小等是否超出系统有关限制。4. 1. 3 使用联合体时,应明确该编译器联合体存储的细节-如联合体的末尾有多少个填充单位、联合体的各个成员如何对齐、多字节的数据类型高低字节排放顺序等。4.1.4 宜注意硬件系统复位和软件复位的方法和区别一一-在程序中宜使用芯片提供的看门狗功能实现硬件系统复位。4. 1. 5 宜注意CPU对各种存储器的访问速度一一在程序中宜利用各种硬件设备自身的特点来提高程

7、序效率。4.1.6 应注意所使用的编译器的目标CPU的位数、支持的C语言标准、调试程序所占用的内存、兼容性等特点。4.1.7 应注意编译器处理不同数据类型的原则及有关细节如static类别的局部变量将在内存数据区中生成,而非statlc类别的局部变量将在堆找中生成。4. 1. 8 应注意程序开发调试环境和实际应用环境的区别。G/T 28169-2011 4.1.9 应用程序宜使用操作系统驱动程序来调用硬件端口。4.2 内存空间管理类4.2.1 在使用malloc等函数获取内存时,应对分配失败做异常处理。4.2.2 动态内存的申请与释放应配对,防止内存泄漏。应用场景主要包括:a) 过程或函数中分

8、配的内存,在过程、函数退出之前要释放;b) 过程或函数中申请的(为打开文件而使用的)文件句柄,在过程、函数退出之前要关闭。规范用法示911: int examp1e_fun (BYTE gt_1阻,BYTE提供一code)BYTE祷gt_buf;gt_buf = (BYTE叫malloc(MAX_GT_LENGTH); /秘g10ba1title length ;rror提/if (gt_1enMAX_GT皿NG四free (gt_buf);/ /退出之前释放gt_bufreturl1 GT I血NGTHERROR; 不规范用法示911: int examp1e_fun (BYTE gt_1e

9、n,BYTE祷gt_code)BYTE * gt_buf; gt buf = (BYTE开)malloc (MAX_GT_LENGTH); /铸globa1title 1ep.gth error养/if (gt_lenM皿.GT一皿盹四)return GT_皿NGTH一回ROR;/退出之前没有释放gt_buf4.2.3 不应使用已经释放的内存空间。4.2.4 应防止越界操作数组、指针、内存地址等内存空间。4.2.5 字符串连接宜使用strncat库函数代替strcat库函数,字符串拷贝宜使用strncpy库函数代替strcpy库函数,避免长度不够引起的数组越界。4.2.6 使用sprintf库

10、函数时,应注意字符长度,避免长度不够引起的数组越界。4.2.7 对于内存受限的系统,宜减少使用动态内存分配,多采用静态分配,在程序编译时就确定所需的空间。4.2.8 对于内存受限的系统,在分配内存时,应考虑内存碎片的问题。2 G/T 28169-2011 4.2.9 对于动态分配的内存指针和文件句柄,在定义的时候应初始化为空,访问的时候应判断是否为空,在释放完成后应设为空。4.3 中断处理类4.3.1 中断服务程序不应带回返回值。4.3.2 不应在中断服务程序中使用printf、malloc等函数。4.3.3 对于中断中使用到的非局部变量,在中断处理函数中应对其进行人找保护。4.3.4 中断处

11、理程序中的变量,如果会被其他函数执行读操作或者写操作,那么在其他函数读写这个变量前,应先关中断,再读写,之后再开中断。4.3.5 对于开关中断,应注意成对匹配一一对于默认开启的中断,如果在某个函数中进行了关闭,在函数退出时需进行相应的开启;对于默认关闭的中断,如果在某个函数中进行了开启,在函数退出时需进行相应的关闭。4.3.6 不应在中断服务程序中进行浮点数运算。4.4 系统接口类4.4.1 不应更改其他模块或系统的有关设置和配置。4.4.2 不应改变与其他模块的接口。4.4.3 应充分了解系统的接口之后,再使用系统提供的功能。4.5 硬件系统初始化类4.5.1 系统运行之初,应初始化有关变量

12、及运行环境。4.5.2 系统运行之初,应对加载到系统中的数据进行一致性检查。4.5.3 在硬件系统初始化之前,有条件时应检测工作电压是否已经稳定。4.6 软件模块初始化类4.6.1 所有变量在使用之前应被初始化。规范用法示例:nun xy +nn 时时mdmJ;一-1lx SSEE-mmr一不规范用法示例zxvd LL+L nn d时mdmvu,一阳山一4.6.2 不应在局部作用域声明变量时使用extern。不规范用法示9JJ: int foo (void) extern int x = 0 ; return (x); 3 GB/T 28169-2011 4.6.3 数组、结构和联合的初始化列

13、表应使用大括号,并使用附加的大括号来指示嵌套的结构E程序员应显式地考虑和描述复杂数据类型的所有元素,不应忽略某个元素的初始化。规范用法示例:int16 _ t Y 3 J 2 J = 1 ,2 , 3 ,4 , 5 ,6 ; 不规范用法示例zint16_t Y 3J 2J = 1 ,2 ,3 ,4 ,5 ,6; int16_t y 3J 2J = 1 ,2; 4.6.4 枚举元素的初始化应完整一一如果对枚举元素进行初始化,只能通过以下两种形式:a) 初始化所有元素;b) 只初始化第一个元素。规范用法示例:enum E_typenuml = 1 ,num2 = 2,nu皿3= 3; enum E

14、_typenuml = 1 ,num2 ,num3; 不规范用法示伊g:|enum E川enuml ,num2 = 2 ,num3 ; 4. 7 版面书写类4.7. 1 文件注释应采用统一格式。宜使用格式如下:规范用法示例:/祷祷Copyright(c) 2007,公司名称祷Allrights reserved. 禄文件名称:fil四ame.c公摘要:简要描述本文件的内容替当前版本:X.X,编写者、修改者、修改时间、修改内容铃历史版本:X.X,编写者、修改者、修改时间、修改内容祷/4.7.2 函数注释应采用统一格式。推荐使用格式如下:规范用法示例:/祷铃函数介绍:祷参数:祷返回值2提备注:祷/

15、4.7.3 不应使用嵌套的注释。4.7.4 应保证注释与代码的一致性,元用的注释应删除。4.7.5 对单条语句代码的注释应放在其上方或右方相邻位置。4.7.6 对于有物理含义的变量、常量、数据结构,如果其命名不是充分自注释的,在声明时应加以注释,说明其物理含义。4 G/T 28169-2011 4.7.7 iLfor,do、while、switch等语句的执行语句部分应使用大括号括起来。规范用法示例:if (a= 1) x= Y; while (b! = 0) putchar (c) ; for (; ;) timetest (n); 不规范用法示伊tl:if (a= 1) x= Y; whi

16、le (b! = 0) putchar (c) ; for (;) timetest (n) ; 4.7.8 注释与其上面的代码应使用空行隔开。4.7.9 宏定义标识符应使用大写字母。规范用法示例:5-4-01-ul-M工MP ee nn-ff ee一,GEd一忡廿扑廿一不规范用法示例:| 忡叫f丑hin#define pi 3.141 59 4.7. 10 函数式宏定义的参数和定义体应使用括号0括起来,但是含有#和#操作符的除外。规范用法示91J:|#削neADD (a,b) (a) + (b) 不规范用法示91J:|#削ne皿D(讪a+b4.7. 11 代码中的一行中只应有一个声明或者一条

17、语句。5 GB/T 28169-2011 不规范用法示例zint i; int j; !铃一行中包含多个声明铸/j=i;i+; !替一行中包含多条语句著/4.7. 12 超过120个字符的长语句,宜分成多行书写。4.7. 13 一个文件中的程序总行不宜超过2000行。4.7. 14 一个函数中的程序总行不宜超过200行。4.7. 15 宜用括号0明确表达式的操作顺序,避免使用默认优先级。4.7.16 不应使用逗号操作符,但是for语句的第一和第三表达式除外。4.8 声明定义类4.8. 1 头文件中只应存放对象或函数的声明,不应存放对象或函数的定义。4.8.2 不应单独使用小写字母1或大写字母0

18、作为变量名。注:小写字母1很容易与数字叮叮昆淆,大写字母0很容易与数字0混淆。4.8.3 函数参数、结构体和联合体的成员不应只有类型名没有标识符的情况出现。4.8.4 使用八进制数应加以注释。注:八进制数以0开始,易与十进制数混淆。4.8.5 局部变量和参数不应与全局变量重名,应避免结构体名、联合体名、枚举名重名。4.8.6 不应使用未知大小的数组。当声明一个数组时,其大小应该显式声明或者通过初始化进行隐式定义。4.8.7 不应重新定义使用C的关键字。4.8.8 非void类型函数每个出口都应有一个含有返回值的return语句,并且返回值与函数返回类型应一致。规范用法示f91J: int fu

19、nc (void) int x = 1; return (x); 不规范用法示f91J: int func (void) return; 4.8.9 不应在函数参数中使用statlc存储类别。不规范用法示例:|int func (时北intx); 4.8.10 调用函数式宏定义时,其参数个数与宏定义时的应一致。GB/T 28169-2011 规范照法示例:j:j: define阻c(x) (x) + 3) a=且BC(b); :j:j: define MAX归,b)(a)(b)? (a):(b) long maxnum = MAX (numl ,num2); 不规范用法示例:斗中defineA

20、BC (x) (x) + 3) a=且BC;丰丰defineMAX (a,b) (的(b)?(a) :(b) long maxnum = MAX (num) ; 4.8. 11 字符型变量应明确定义是有符号的还是无符号的。4.8. 12 在同一嵌入式软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突例如,可规定接口部分的变量与常量之前加上模块名称标识等。4.8. 13 在文件范围内声明和定义的所有对象或函数均应具有内部链接,除非是在需要外部链接的情况下。4.8. 14 用typedef自定义的类型不应被重新定义。注:改变用户自定义的类型会引起混淆甚至能

21、导致错误。4.8. 15 匹配的预处理语句:j:j: if、:j:j: else、:j:j: elseif和:j:j:endif不应被分散在不同的文件之中。4.8.16 :j:j:if表达式中使用的宏应该已经被定义,并且:j:j: if表达式只能包含整型常量。不规范用法示f91J: :j:j: define BIG工配32767:j:j: define BIG阻ALle3B :j:j: if (BIG阻且LBIGINT)/祷BIGRE泣,是浮点型常数赞/#四dif4.8. 17 应避免一个头文件的内容被包含两次。4.8. 18 宏如果需要被重定义,应该先用:j:j:undef解除前面的定义。4

22、.8. 19 除了编译开关和头文件等特殊应用外,不应使用一EXAMPLE_TEST _之类以下划线字符二开始和结尾的定义。4.8.20 标识符命名中不应包含两个连续的下划线字符一。4.8.21 不应使用static存储类别定义标记。不规范用法示f91J: i static s叩S叫t句intb; 4.8.22 不应把地址操作符&.用于一个声明为register的对象。7 G/T 28169-2011 不规范用法示例zstatic void foo (void) register int a; 口吐*pa; pa=&a; I赞&不应用于一个声明为register类型的对象椿/r呵isteri眈a

23、rray10J; int赞ptr= &array oJ; I旷&不应用于一个声明为register类型的对象铃/4. 8. 23 struct或umon的定义体中至少应有一个成员。4.8.24 不应对struct或umon成员使用存储类指示符。不规范用法示例zlmud extern int f ield, 4. 8. 25 struct或unon类型的成员不应是void类型、函数类型、未知大小的数组和含有未知内容的struct或union。4.8.26 宜使用typedef在头文件中对基本类型定义。规范用法示tJ: typedef char chartFtypedef signed char

24、扛lt8t;typedef signe2) ret +; break; case 1. ret = 2; break; case 2. ret = 3; break; default. ret = 4; break; 4. 9. 11 case表达式的大小不应超过switch控制表达式的大小。4.9.12 循环控制变量不应使用浮点类型变量。9 G/T 28169-2011 不规范用法示例:for (ft = o. OF;ft void foo (jmp_buf mark,unsigned int val) longjmp (mark,val); 4.9. 17 不宜使用goto语句及标号。4.

25、9.18 不宜在循环中使用continue和break语句。4.9. 19 for循环不应只执行一次。4.9.20 控制结构的嵌套层数应限制在一定范围内。4.10 类型转换类4.10. 1 应减少不必要的数据类型默认转换与强制转换;表达式如果是函数的参数或函数的返回表达式,不能出现默认数据类型转换;常数被默认转换为元符号数时,应充分考虑到无符号变量的所占字节空间。4.10.2 应禁止signed类型与unsigned类型之间的隐式转化。注:从有符号类型转换为无符号类型会导致符号的丢失;无符号数转换为有符号数时,可能得到一个负值。4.10.3 应禁止int类型与float类型的隐式转化。注:浮点

26、类型与整型之间的相互转换会导致精度的损失。G/T 28169-2011 不规范用法示例2double d64_a; float f32_a; signed扫lti16_a; /提整型数转换为浮点数赞/铃浮点数转换为整型数赞/EF aa -62 嘈止、J正在4= aa - AMZEO FO唱i,dEl 4.10.4 不应对指针变量使用强制类型转换赋值。不规范用法示例zvoid foo (void) unsigned short s = 0 ; unsigned int提pl_ptr;pl_prt = (unsigned int祷)s; 指针、数组使用类4. 11. 1 不应把自动类型的局部变量的

27、地址赋值给外部指针。不规范用法示-&tJ: 4. 11 extern扫lt提pi;void f (void) int a; pi = &a; 指针的指针不应超过两级。4. 11. 3 指向不同数据类型的指针之间不应相互转换。注:不同的数据类型分配的字节空间可能不同,将指向多字节空间的指针转换为指向少字节空间的指针不会有问题,反之有可能出现错误。4. 11. 4 指针转换过程中不应丢失指针的const、volatile属性。规范用法示例:4. 11. 2 /餐指向整型的指针祷/并const指针祷/祷指向const整型的指针铸/祷指向volatile整型的指针铃/int X; int * pi;

28、int提constpcil = &x; const int祷pci2;/提符合本条要求祷/养不符合本条要求铸/并不符合本条要求祷/volatile int祷pci3;pi = pcil; pi = (int提)pci2 pi= (int祷)pci3 11 GB/T 28169-2011 4. 11. 5 只有指向数组的指针才允许进行算术运算。注:此处的算术运算仅限于指针加减某个整数,比如ppoint=point一5, ppoint+ +等。规范用法示例:int * PX; int a 10J; pX= a; px=px+2; + pX; 不规范用法示例z扛吐*pX; 扫lti; px= &i;

29、 px=px+2; + px; 4. 11.6 只有指向同一数组的两个指针才允许相减。注:此处两个指针可以指向同一数组的不同成员。不规范用法示例zint a 10J; int b 10J; 扛ltx,祷p1,* p2; p1 = a; p2 = b; x = p1 - p2; 4.11.7 只有指向同一数组的两个指针才允许用、=、和=等关系运算符进行比较。注:此处两个指针可以指向同一数组的不同成员。规范用法示例:char a 10J; char善p1,* p2; int X; p1 = a; p2=a+2; x= p1p2; 不规范用法示例:char a 10J; char b 10J; in

30、t X; x= ab; 12 GB/T 28169-2011 4. 11. 8 指针的索引值不应为负数。不规范用法示itJ:void foo (int赞p,intn) int r; if (n - 5) r=pnJ; /提指针的索引值为负数赞/r=祷(p+ n); /铸指针的索引值为负数赞/4. 11. 9 不应对指针值可能为NULL的指针进行算术运算。不规范用法示例:extern int buf 10J; void foo (int n) int祷p=NULL; for (i= l;i = n; + i) p= &buf iJ; + p; /祷对指针值可能为阳LL的指针进行算术运算祷/4.1

31、 1. 10 对于传递到函数的指针参数,应判断是否为空。4. 11. 11 调用返回类型为指针的函数后,应判断返回值是否为空。4.1 1. 12 除常量字符串外,其他字符数组应指定长度。4.1 1. 13 不应把局部变量的地址在本对象消亡后传给另外一个对象。分为如下三种情况za) 将动态分配的局部变量的地址赋值给一个带链接的或更宽范围的指针是危险的,一旦局部变量的内存空间被释放,这个指针会成为元效的指针(见不规范用法示例中函数fool); b) 函数参数不应返回动态数据的地址(见不规范用法示例中函数foo2); c) 函数参数不应返回本地静态数据的地址(见不规范用法示例中函数foo3)。不规范

32、用法示伽: extern int提pi;void foo1 (void) int a; pi = &a; 13 GB/T 28169-2011 void foo2 (int祷appi)int bi = 1; 祷appi= &.bi; return; void foo3 (int铸appi)static int bi = 1 ; 兴appi=&.bi; return; 4.1 1. 14 一个未知大小的对象的指针不应成为加法或者减法操作的左操作数。不规范用法示伊tl:typedef struct TAG T; static int f(int n,void势pv)T * vl = 0; vl=v

33、l+n; I挺不符合本条要求祷/pv= pv+ n; I养不符合本条要求祷/vl = vl- n; I养不符合本条要求铃/pv = pv- n; I祷不符合本条要求蕃/4.11.15 数组的索引值不应越界。4.1 1. 16 多线程应用中被几个任务共享的变量宜使用volatile。4.12 运算处理类4. 12. 1 不应对有符号数进行位运算。4.12.2 不应将无格式的字符型变量和元符号变量与负数常量和零比较。注:无格式的字符型指既没有定义为unsigned也没有定义为signed的char类型。不同的编译器对其处理是不一样的,有的定义其可正可负,有的定义其只能为正。14 不规范用法示例:v

34、oid f (char c1) if (c1 - 3) /提和负数常量比较祷/c1+p if (clO) /援和零比较祷/c1+5 4. 12.3 对变量进行移位操作应保证不会产生溢出和数据截短。4.12.4 不应在布尔表达式中使用赋值运算符。4.12.5 不应对布尔表达式进行算术或者位运算。4.12.6 表达式的值在任何求值顺序下应保持一致。注z防止同一个表达式在不同的编译器中得到的结果不一样。规范用法示例:x=biJ+i; i + ; x= 2; y= 3; x = y* x; x+ ; 不规范用法示例:x=biJ+i+; /赞不同的编译器给出的结果不一样,biJ不一定先执行提/x= 2;

35、 y= 3; x=y蕃x+; /提求值顺序无法确定祷/4. 12.7 应避免除数可能为0的情况出现。GB/T 28169-2011 4. 12.8 不应对赋值运算符的左操作数进行转换操作,并且赋值运算符的左操作数应该是一个可更改的对象。不规范用法示例:int c = 0; float ff = 20. OF; float gg = 5. OF; const float f1 = O. OF; f1 = O.四;/祷不符合本条要求提/(char) c = ff祷gg;/将不符合本条要求祷/4. 12. 9 sizeof操作符不应使用在有副作用的表达式上。15 GB/T 28169-2011 规范

36、用法示例zint i; int j; j = sizeof (i); i= 1234; 不规范用法示例:int i; 扛ltj; j = sizeof (i = 1234); /祷i=1234没有执行善/4. 12. 10 逻辑运算符&或者11右边不应包含有副作用的表达式。注:如果&.&.的左边已经为0或者11的左边已经为1,则右边不会执行。不规范用法示f9lJ:if (ishight) &. &. (x = i + ) /祷如果ishight= 0,那么i+不会执行提/4.12.11 逻辑运算符(&、11和1)的操作数宜为一个有效的布尔值,布尔值表达式不宜进行逻辑运算以外的操作。4.12.1

37、2 不应对元符号的表达式进行一元减运算。4.12.13 不应在同一个表达式中混合使用+和一一运算符。4. 12. 14 不应对浮点类型变量使用=和!=作比较。4. 13 函数使用类4. 13. 1 函数调用时,实参的个数和类型应与函数声明一致。4.13.2 函数原型中的指针参数如果不是用于修改就应声明为指向const的指针。规范用法示f9lJ: void myfunc (int16_t提para皿1,const int16_t善p缸am2,constint16 t祷param3)/祷param1:指针指向的对象被修改了一不需要const限定par四2:指针指向的对象没有被修改一需要const限

38、定par四3:指针指向的对象没有被修改一需要const限定提/祷param1=赞param2+铃param3; return; 4. 13.3 不应把auto类型的局部变量地址作为函数的返回值或者通过指针参数返回。注:return语句不可返回指向校内存的指针或者引用Dauto类型的局部变量在退出函数后会被自动销毁,内存变为没有意义。16 GB/T 28169-2011 不规范用法示911: void foo (int祷蕃appi)int bi = 1; 铸appi= &bi; /祷不符合本条要求祷/return; int8 t祷foobar(void) int8_t local_auto; r

39、eturn (&local_au,to) ; /铃不符合本条要求祷/4.13.4 在函数的调用中,函数标识符之后应该有0。注:在函数的调用中,如果函数名后面不加0,表示函数的指针,而不是函数的调用。4.13.5 不应在函数中使用statc类别的局部变量。注:尽量避免函数带有记忆功能,相同的输入应当产生相同的输出。带有记忆功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种记忆状态。这样的函数既不易理解又不利于测试和维护。4.13.6 应避免函数参数在调用中未被使用。4. 13.7 宜谨慎使用abort,ext等函数。注:这些函数会导致程序终止执行,有可能导致嵌人式系统无法正常运行。4

40、.13.8 不宜使用函数的递归调用。注:递归调用特别是函数间的递归调用(如ABCA),影响程序的可理解性;递归调用一般都占用较多的系统资源(如堆楼空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。4. 14 冗余类4. 14. 1 不应存在执行不到的代码。4.14.2 表达式语句上层不应包括多余的操作符和转换。不规范用法示例za= =b+; /提该表达式包含的操作符-.;:;: .没有被用到祷/(int) (a += 1); 4.15 程序效率类4. 15. 1 应保证循环体内工作量最小化。规范用法示911: /提语句back_sum= sum应

41、放在for语句之后祷/for (ind = 0; indMAX_ADD肌JMBER;ind + ) su皿+=ind; back_sum = sum; /铃backupsum祷/17 GB/T 28169-2011 不规范用法示例z/善如下代码效率不高铃/for (ind = 0; indMAX_阻止肌JMBER;ind + ) sum+= ind; back_sum = sum;/祷backupsum铃/4.15.2 在多重循环中,应将循环次数多的循环放在内层。规范用法示例zfor (col = 0 ;colS ;col + ) for (row= O;row100;row+) sum +=

42、 a rowJ colJ; 不规范用法示例zfor (row = 0 ;row100 ;row + ) for (col = 0 ;colS ;col + ) sum += a rowJ colJ; 4.15.3 循环体内不宜包含判断语句。注:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而定。在一般情况下,与循环变量元关的判断语句可以移到循环体外。4.15.4 应注意switch-case语句的使用。注:为了提高程序效率,应把switch也case语句中的每一种具体情况按照它们发生的相对频率排序。即把最可能发生的情况放在最前,最不可能发生的情况放在最后。4.1

43、5.5 应避免使用标准库函数。注2很多大的库例程设法处理所有可能的情况,占用了庞大的内存空间,因此嵌入式系统编程应尽可能地减少使用标准库函数。5 符合性当需要验证编译器和静态分析工具与本标准的符合性时,可参照附录A进行。18 附录A(资料性附录)符合性矩阵验证编译器和静态分析工具对本标准的符合性,可使用下面的符合性矩阵z要求条目是否符合要求编译器1编译器2静态分析工具14. 1. 1 Yes Warning 121 Warning 100 4. 1. 2 Yes Warning 86 Warning 152 4. 1. 3 No Warning 94 . . . . . 合计(符合本标准的条数

44、G/T 28169-2011 静态分析工具2Error 23 Warning 57 . 19 GB/T 28169-2011 参考文献lJ GJB 5369一2005航天型号软件C语言安全子集2J MISRA-C: 2004 Guidelines for the use of the C language in critical system 3J ISO/IEC 9899: 1990 Programming language-C 20 =ON|-NH阁。华人民共和国家标准嵌入式软件C语言编码规范GB/T 28169-2011 国中每中国标准出版社出版发行北京市朝阳区和平里西街甲2号(100013)北京市西城区三里河北街16号(100045)网址总编室:(010)64275323发行中心:(010)51780235读者服务部:(010)68523946中国标准出版社秦皇岛印刷厂印刷各地新华书店经销峰印张1.75 字数41千字2012年4月第一次印刷开本880X12301/16 2012年4月第一版峰27.00元如有印装差错由本社发行中心调换版权专有侵权必究举报电话:(010)68510107及二价书号:155066. 1-45040 GB/T 28169-2011 打印日期:2012年4月16HF002A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 标准规范 > 国家标准

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1